最常见的原因可能是没有正确设置recvmsg()中的缓冲区。 下面是一个示例代码,演示如何设置它并正确接收消息:
struct sockaddr_nl address; memset(&address, 0, sizeof(address)); address.nl_family = AF_NETLINK; address.nl_pid = getpid(); address.nl_groups = 0;
int socket_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); bind(socket_fd, (struct sockaddr *) &address, sizeof(address));
struct msghdr message; memset(&message, 0, sizeof(message));
char buffer[4096]; memset(buffer, 0, sizeof(buffer));
struct iovec iov; iov.iov_base = (void *) buffer; iov.iov_len = sizeof(buffer);
message.msg_name = (void *) &address; message.msg_namelen = sizeof(address); message.msg_iov = &iov; message.msg_iovlen = 1;
recvmsg(socket_fd, &message, 0);
这里使用的是NETLINK_ROUTE套接字类型。参数0表示没有任何标志。 如果你使用的是其他类型的Netlink套接字,代码可能需要进行适当的更改。