gpt4 book ai didi

c - 我通过套接字发送一个 C 结构,但不能正确发送,总是遗漏一些字节

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:44 24 4
gpt4 key购买 nike

更新:我添加了一个 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发送一个结构mfsiowrite的返回值是37772,但是当我从其他程序中获取时,的返回值code>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->sizepread的res为32678,write的res > 是 32772。但是 read 的 res 是 32678.

怎么会发生这种事?我在这里做错了什么吗?

如果write 没有输入,read 函数将只是等待一些数据并卡在那里

如果我使用循环来避免这样的问题,我怎么能最终得到整个数据结构,我的意思是如果我循环读取,我会从套接字中得到剩余的字节,但我怎么能把这些组合起来我得到的剪辑?

最佳答案

您需要循环读取和写入,直到读取/写入所有预期数据。对于读取,您必须读取直到它返回 0,表示没有其他可用的。或者-1表示错误。

您最近的问题是您正在对结构指针使用指针算法:

tmp = recv(connfd, rcvread + res, rcvread->size + 4 - res, 0);

在 C 中,当您进行指针运算时,您不是在处理字节,而是在处理对象的大小(例如 rvcread)。您应该定义一个 char *,这是您将读入的字节位置,然后在您读取数据时更新它。

关于c - 我通过套接字发送一个 C 结构,但不能正确发送,总是遗漏一些字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8645422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com