更新: 我添加了一个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