2017-03-24 63 views
1

我的客戶端程序需要將大文件發送到服務器程序。客戶端連接到服務器並且服務器接受它後,客戶端指定它將發送的文件的名稱。現在,客戶端需要使用TCP發送文件。使用TCP發送大文件

我知道如果文件的大小很小(小於1k字節?),我可以直接使用一個調用發送給套接字編程中的「send」函數。但是,如果我的文件大小很大,例如大約100 MB,那麼是否也執行相同的工作?我想知道「發送」本身是否處理將大數據分解成數據包並將其可靠發送的任務,或者我應該是處理這種情況的人嗎?

謝謝。

+0

您還沒有指定一個語言,或者一個平臺/ OS,或任何東西。 –

+0

您必須*總是*查看send()調用的返回值,以查看它實際從數據中讀出的數據字節數,並將其放入套接字的傳出數據緩衝區。對於「少量」數據而言,這種情況也是如此,儘管大量數據(但人們似乎放棄不這樣做的事實有時會使他們相信)。根據send()返回的值,您需要確定接下來要做什麼(例如再次使用更新的參數調用send()以發送更多數據或發生錯誤,或者如果已發送所有字節,則返回成功) –

+0

它使用C.它的套接字編程模塊中有一個叫做send的函數。 –

回答

0

我想類似的東西&我的客戶端代碼看起來像這樣

static void send_file(char *ipAddress, char *filename) 
{ 
     struct sockaddr_in serverAddr; 
     int skt; 
     uint32_t addr_size; 
     uint32_t sz; 
     int32_t sent_bytes; 
     FILE *fp; 

     if (inet_pton(AF_INET, ipAddress, &(serverAddr.sin_addr))){ 
       skt = socket(PF_INET, SOCK_STREAM, 0); 
       serverAddr.sin_family = AF_INET; 
     } 
     else { 
       inet_pton(AF_INET6, ipAddress, &(serverAddr.sin_addr)); 
       skt = socket(PF_INET6, SOCK_STREAM, 0); 
       serverAddr.sin_family = AF_INET6; 
     } 

     serverAddr.sin_port = htons(7891); 

     memset(serverAddr.sin_zero, '\0', sizeof(serverAddr.sin_zero)); 

     addr_size = sizeof(serverAddr); 
     connect(skt, (struct sockaddr *) &serverAddr, addr_size); 

     /*find file size*/ 
     fp = fopen(filename, "r"); 
     fseek(fp,0,SEEK_END); 
     sz = ftell(fp); 
     rewind(fp); 

     sent_bytes = send(skt, fp, sz, 0); 
     printf("sent %d bytes\n", sent_bytes); 
     fclose(fp); 
}