【发布时间】:2011-12-27 13:56:52
【问题描述】:
更新:
我添加了一个while 来获取剩余数据,问题解决了。谢谢你们。
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,pread的res是32678,write的res是32772。
但read 的 res 是 32678。
怎么会发生这种事?我在这里做错了吗?
如果没有来自write 的输入,read 函数将等待一些数据并挂在那里
如果我使用循环来避免这样的问题,我怎样才能最终得到整个数据结构,我的意思是如果我循环读取,我会从套接字中获取剩余的字节,但是我该如何组合这些我收到的剪辑?
【问题讨论】:
-
作为循环的一部分,您必须调整您读取的指针,将您之前读取的字节数添加到其中。不过,请确保您为此指针算术使用 char 指针。
-
结构包装不可移植。您需要发送数据的序列化表示。
-
@kaizer.se 那么有没有 linux 上的 lib 可以做到这一点?我已经做了一些谷歌搜索,但没有找到。