執行循環send()
是否有任何問題,其中「const void *buf
」(第二個參數)是以二進制模式打開的文件的文件描述符(fopen("C:\example.mp3", "rb")
)?發送二進制數據
Q
發送二進制數據
6
A
回答
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
你的意思是你想通過套接字發送文件的內容是什麼?如果是這樣,應該沒有問題,但是必須從文件讀取數據到緩衝區,然後將緩衝區中的數據傳輸到套接字。 – 2011-02-17 01:35:07