2011-02-17 155 views
6

執行循環send()是否有任何問題,其中「const void *buf」(第二個參數)是以二進制模式打開的文件的文件描述符(fopen("C:\example.mp3", "rb"))?發送二進制數據

+1

你的意思是你想通過套接字發送文件的內容是什麼?如果是這樣,應該沒有問題,但是必須從文件讀取數據到緩衝區,然後將緩衝區中的數據傳輸到套接字。 – 2011-02-17 01:35:07

回答

5

send的參數必須指向內存緩衝區,填充您想要發送的值(字節)。您可以將send()的參數const void *buf視爲const char *buf - 它只是字符數組,它不會被send()函數更改。

但是,fopen()返回到你FILE* - 這是一個指向特殊結構FILE。所以,如果要發送文件的內容,則應該讀取tmp緩衝區的內容,使用fread()函數& FILE*指針,然後將tmp緩衝區加載到send()函數中。重複此代碼fread() & send(),直到您達到文件結尾。

示例代碼(在http://developerweb.net/viewtopic.php?pid=28854找到)

int file2socket (FILE *fp, int sockfd) 
{ 
    char tmp[8*1024]; 
    int len; 
    int ret; 

    for (ret = 0;;) { 
     len = fread (tmp, 1, sizeof (tmp), fp); 
     if (len == 0) { 
      ret = feof (fp); 
      break; 
     } 
     if (!send (sockfd, tmp, len, 0)) break; 
    } 

    return (ret); 
} 
+0

在Linux上,還有一個系統調用`sendfile`,它實際上消除了用戶空間並加快了速度 - http://www.kernel.org/doc/man-pages/online/pages/man2/sendfile.2。 html – 2011-02-17 02:06:52