更新: 我添加了一個while
以獲取剩餘數據,解決了問題。謝謝你們。我通過套接字發送C結構,但無法正確地完成,總是會丟失一些字節
while(res != rcvread->size + 4) {/* do not get full data */
tmp = recv(connfd, (void *)rcvread + res, rcvread->size + 4 - res, 0);
if(tmp == -1)
printf("error:%s\n",(char *)strerror(errno));
res+=tmp;
}
我想通過socket發送結構mfsio
的write
返回值是37772,但是當我從其他程序得到它的read
返回值是32768,這是非常奇怪的。
這種結構的定義在這裏
struct mfsio{
size_t size;
char buf[];
};
的發送代碼是在這裏
struct mfsio *sndread;
sndread = malloc(sizeof(struct mfsio) + rcvcmd->size);
res = pread(fd, &(sndread->buf), rcvcmd->size, rcvcmd->offset);
sndread->size = res;
res = write(connfd, sndread, sizeof(struct mfsio) + res);
接收代碼是在這裏
struct mfsio *rcvread;
rcvread = malloc(sizeof(struct mfsio) + size);
res = 0;
res = read(connfd, rcvread, sizeof(struct mfsio) + size);
size
等於rcvcmd->size
和RES pread
是32678,水庫write
是32772. 但read
的資源是32678.
這種情況怎麼會發生?我在這裏做錯了什麼?
如果沒有來自write
輸入時,read
功能只是在等待一些數據,只是掛在那裏
如果我使用一個循環來避免這樣的問題,我怎麼能最終得到了整個數據結構,我的意思是如果我循環讀取,我會從套接字中獲取剩餘的字節,但我怎樣才能將這些剪輯合併到一起?
您必須將您讀入的指針調整爲循環的一部分,並在其中添加之前讀取的字節數。確保你使用這個指針算術的字符指針。 – 2011-12-27 14:14:50
結構填充不可移植。您需要發送數據的序列化表示。 – u0b34a0f6ae 2011-12-27 19:06:24
@ kaizer.se那麼,有沒有在Linux上的任何lib可以做到這一點?我做了一些谷歌搜索,但沒有找到。 – bxshi 2011-12-28 08:40:56