gpt4 book ai didi

c - kernel_recvmsg 有时会得到错误的数据

转载 作者:行者123 更新时间:2023-11-30 16:43:35 25 4
gpt4 key购买 nike

我有一个模块,它分两部分接收数据。首先是一个无符号整数,指示接下来要跟随的数据的长度。然后是数据本身。我在无限循环中按如下方式执行此操作

unsigned int z;
struct kvec vec;
struct msghdr msg;
while(1) {
memset(&vec, 0, sizeof(vec));
memset(&msg, 0, sizeof(msg));
vec.iov_base = &z;
vec.iov_len = sizeof(unsigned int);

ret = kernel_recvmsg(client_socket, &msg, &vec, 1, vec.iov_len, 0);
if(!z)
break;
data = kmalloc(z, GFP_KERNEL);
if(!data)
break;
memset(&vec, 0, sizeof(vec));
memset(&msg, 0, sizeof(msg));
vec.iov_base = data;
vec.iov_len = z;
ret = kernel_recvmsg(client_socket, &msg, &vec, 1, vec.iov_len, 0);
...
...
kfree(data);
}

编辑:由于接收不完整,我得到了错误的数据。我的 ret < vec.iov_len。有没有办法解决这个问题?

谢谢。

最佳答案

我通过更改标志来修复它。这些链接会有帮助

http://www.beej.us/guide/bgnet/output/html/multipage/recvman.html

http://elixir.free-electrons.com/linux/latest/source/include/linux/socket.h#L277

在第二个链接中,您可以找到所有可用标志以及这些标志子集的描述。我之前使用标志字段为 0,这意味着没有特别的选项,通过将其更改为 MSG_WAITALL,该命令在返回之前等待整个 iov.len 大小的消息。不完整的接收早些时候损坏了我的数据。

关于c - kernel_recvmsg 有时会得到错误的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45140394/

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