2013-04-26 93 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/