2013-04-26 95 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

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)。 – 2013-04-26 04:43:13

回答

2

至于你的问题没有1.庞大的数据在许多数据包&打破然后通过数据包发送的数据包由内部操作系统完成。 &一个数据包大小取决于您的系统操作系统(您可以更改它,它被称为MTU最大传输单位)。

&对于您的问题否2.只要您希望发送它将发送的数据,由套接字端口发送的数据可能是无限的。没有限制。

2

问:如果输入的字节非常大?什么是可以通过套接字端口发送的最大数据?

答:TCP/IP流的大小没有限制。从理论上讲,您可以发送和接收无限数量的字节。

... ...但是...

1)接收器必须从未假设是永远不会得到所有字节一次,在一个单一的读取。您必须始终在循环中读取套接字数据,按您的意愿随时读取数据,并将其附加到您已阅读的数据中。

2)您可以一次发送“大量”数据,但操作系统会将它缓冲在背后。

3)即使如此,仍然存在操作系统限制。例如,这里的最大发送缓冲区大小为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/