2013-12-09 135 views
0

嘗試讀取塊中的文件並通過TCP連接發送每個塊。當讀取/發送循環完成時,我發送確認消息。任何時候我的文件大於一個塊,這幾乎總是,確認消息永遠不會到達。無法分辨這是因爲它沒有被髮送或只是沒有收到。它似乎被髮送了,但我無法確定。對於小文件,這工作得很好。文件本身在所有情況下都能正確發送,但我也需要此確認消息發送。文件讀取,未收到TCP消息

任何人都可以看到爲什麼這可能會發生?

   int header_size = sizeof("file,,") + sizeof(int); 
       int bytes_remaining, filesize; 
       fseek(fp1, 0L, SEEK_END); 
       filesize = bytes_remaining = ftell(fd); 
       fseek(fd, 0L, SEEK_SET); 

       int bytes_to_read; 

       if ((BUFFSIZE - header_size) < bytes_remaining) { 
        bytes_to_read = BUFFSIZE - header_size; 
       } else { 
        bytes_to_read = bytes_remaining; 
       } 

       while (bytes_read = fread(buffer, 1, bytes_to_read, fd) > 0) { 

        sprintf(message, "file,%d,%s", bytes_to_read, buffer); 
        send(sd, message, bytes_to_read + header_size, 0); 

        bytes_remaining -= bytes_to_read; 

        if ((BUFFSIZE - header_size) < bytes_remaining) { 
         bytes_to_read = BUFFSIZE - header_size; 
        } else { 
         bytes_to_read = bytes_remaining; 
        } 

        bzero(buffer, BUFFSIZE); 
       } 

       // send confirmation message 
       bzero(buf, 256); 
       sprintf(buf, "send_complete"); 
       send(sd, buf, 256, 0); 
       fprintf(stdout, "complete: %s\n", buf); 
+0

您是否檢查發送的返回值? – fjc

回答

2

send(),就像write()fwrite並不能保證所有的數據被消耗。 您必須檢查send()的返回值,以確定實際發送的字節數。

我猜你錯過了確認消息,因爲TCP輸出緩衝區已滿。