2013-04-26 3 views
3

나는 클라이언트에서 입력을 받아 서버에서 작업을 수행하고 클라이언트에 데이터를 쓰는 프로그램을 구현했습니다. 예를 들어 ls 명령을 선택했습니다.포트 소켓을 통해 보낼 수있는 최대 데이터

지금 내 의심의 여지가있다 입력 바이트 매우 큰 어떤 경우

1) ??

2) 소켓 포트를 통해 보낼 수있는 최대 데이터는 무엇입니까 ??

client.c

int main() 
{ 
     FILE *fp; 
     int servfd, clifd; 
     struct sockaddr_in servaddr; 
     struct sockaddr_in cliaddr; 
     int cliaddr_len; 
     char str[4096], clientip[16]; 
     int n; 

     servfd = socket(AF_INET, SOCK_STREAM, 0); 
     if(servfd < 0) 
     { 
       perror("socket"); 
       exit(5); 
     } 

     servaddr.sin_family = AF_INET; 
     servaddr.sin_port = htons(SERVPORT); 
     servaddr.sin_addr.s_addr = inet_addr(SERVIP); 

     if(bind(servfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) 
     { 
       perror("bind"); 
       exit(0); 
     } 

     listen(servfd, 5); 

     printf("Server is waiting for client connection.....\n"); 

     while(1) 
     { 
       cliaddr_len=sizeof(cliaddr); 
       clifd = accept(servfd, (struct sockaddr *)&cliaddr, &cliaddr_len); 

       strcpy(clientip, inet_ntoa(cliaddr.sin_addr)); 
       printf("Client connected: %s\n", clientip); 

       if(fork() == 0) 
       { 
         close(servfd); 
         while(1) 
         { 
           n = read(clifd, str, sizeof(str)); 
           str[n] = 0; 

           if(strcmp(str, "end") == 0) 
           { 
             printf("\nclient(%s) is ending session and server is waiting for new connections\n\n", clientip); 
             break; 
           } 
           else if (strcmp(str, "ls") == 0) { 
             system("ls >> temp.txt"); 
             fp = fopen("temp.txt", "r"); 
             fread(str, 1, 500, fp); 
             remove("temp.txt"); 
             } 
           else 
             printf("Received from client(%s): %s\n", clientip, str); 

           write(clifd, str, strlen(str)); 
         } 
         close(clifd); 
         exit(0); 
       } 
       else 
       { 
         close(clifd); 
       } 
     } 
} 

server.c 거대한 데이터 패킷 수 & 깨진 아니 1. 다음 패킷으로 패킷을 전송하지 귀하의 질문에 관해서는

int main() 
{ 
     int sockfd; 
     struct sockaddr_in servaddr; 
     char str[500]; 
     int n; 

     sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

     servaddr.sin_family = AF_INET; 
     servaddr.sin_port = htons(SERVPORT); 
     servaddr.sin_addr.s_addr = inet_addr(SERVIP); 

     if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) 
     { 
       printf("Could not connect to server: %s\n", strerror(errno)); 
       exit(1); 
     } 

     while(1) 
     { 
       printf("Enter message: "); 
       scanf(" %[^\n]", str); 
       write(sockfd, str, strlen(str)); 

       if(strcmp(str, "end") == 0) 
         break; 

       n = read(sockfd, str, sizeof(str)); 
       str[n] = 0; 
       printf("Read from server: %s\n", str); 
     } 

     close(sockfd); 
} 
+2

난 아무것도 사용하여 소켓 프로그래밍되어 모두가 [Beej의 가이드를 읽을 것을 생각 네트워크 프로그래밍] (http://beej.us/guide/bgnet/output/html/multipage/index.html)을 참조하십시오. –

답변

2

의 OS에서 내부적으로 수행합니다. & 하나의 패킷 크기는 시스템 OS에 따라 다릅니다 (변경할 수 있습니다. MTU 최대 전송 단위라고 함).

& 질문 2 : 소켓 포트로 보내지는 데이터는 보낼 데이터를 보내고 싶은 한 무한대입니다. 제한이 없습니다. !!!

2

Q : 입력이 매우 큰 경우 어떻게해야합니까 ?? 소켓 포트를 통해 보낼 수있는 최대 데이터는 무엇입니까 ??

A : TCP/IP 스트림의 크기에는 제한이 없습니다. 이론 상으로는 무한 바이트 수를 보내고받을 수 있습니다.

... 그러나 ...

1) 이제까지 하나의 읽기에, 한 번에 모든 바이트를 얻을 것이다 가정하지해야하는 수신기. 항상은 루프에서 소켓 데이터를 읽고, 원하는만큼 한 번 읽고, 이미 읽은 데이터에 추가해야합니다.

2) "많은 양의 데이터를 한 번에 보낼 수 있지만 OS가 뒤에서 버퍼링합니다.

3) 그럼에도 불구하고 OS 제한이 있습니다. 루프에서(), 당신은 전송해야 더 보내야 할 경우 예를 들어, 다음은 최대 전송 버퍼 크기는 1 048 576 바이트 :

http://publib.boulder.ibm.com/infocenter/tpfhelp/current/index.jsp?topic=%2Fcom.ibm.ztpf-ztpfdf.doc_put.cur%2Fgtpc2%2Fcpp_send.html

입니다.

는 PS :

아니시 추천으로 확실히 체크 아웃 네트워크 프로그래밍 Beej의 가이드 :

http://beej.us/guide/bgnet/output/html/multipage/

관련 문제