gpt4 book ai didi

Linux套接字编程调试?

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

我有一个这样的函数:

static int
rcv_kern(int sock, void *buf, int len, struct sockaddr *addr,
socklen_t *addrlen)
{
struct timeval timeout = {1, 0};
fd_set set;
int status;

FD_SET(sock, &set);
if ((status = select(sock + 1, &set, NULL, NULL, &timeout)) == 0) {
FD_ZERO(&set);
fprintf(stderr,
"timeout while receiving answer from kernel\n");
exit(1);
} else if (status == -1) {
FD_ZERO(&set);
perror("recvfrom failed");
exit(1);
}
FD_ZERO(&set);
return recvfrom(sock, buf, len, 0, addr, addrlen);
}

用于使用 netlink 从内核空间接收消息。但是当我运行它时,结果总是从源代码中显示“从内核接收答案时超时”的消息,这是由于“select”方法总是返回“0”的原因。不知道是什么原因,谁能给我点建议,谢谢。

最佳答案

查理,
几件事:

1) 你可能应该循环你的 select() 调用,并且只有在 FD_ISSET() 在你的文件描述符上返回 true 时才调用 recvfrom。
2) 确保在 netlink 套接字上发送的实际驱动程序或内核代码实际上正在向其写入/发送数据。如果不是,那么如果它在 1 秒内没有接收到数据,那么您的函数将超时。 (这就是您设置的超时时间)。

一些一般性评论...在 Linux 中,当使用 select() 系统调用时。超时数据结构在每次调用后都会重置,因此如果您将代码更改为围绕选择循环,您可能应该这样做......您必须为循环中的每次迭代重置超时值。

另外,如果 select 超时,那并不一定意味着它是一个错误。请记住,select 是一个非阻塞调用。它只会在套接字上等待给定的“超时”时间并返回。如果你无论如何都想从文件描述符中读取...意味着你希望你的 recv_kern() 函数阻塞直到有数据返回,那么不要费心使用 select()。直接在文件描述符上调用 recvfrom() 即可。这样,您的 recv_kernel() 函数将阻塞并仅在读取内核发送的数据后返回。


如果不了解更多关于如何使用此代码的上下文,很难在此处提供更具体的帮助。我假设这是您编写的将数据发送到用户空间的自定义内核模块,对吗?
尝试将 recv_kern() 函数更改为阻塞(取出选择代码并调用 recvfrom())。这种方式应该能够判断您的内核驱动程序是否实际上正确地将数据发送到用户空间。如果你在 recvfrom() 上阻塞并且什么都没有返回..那么你的内核驱动程序也可能有问题。

希望对您有所帮助。

关于Linux套接字编程调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/822964/

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