Networking netlink_广播失败,返回值为-3
我无法通过以下代码将netlink消息广播到用户空间。然而,我没有发现任何错误。我的用户空间程序可以接收其他类型的广播消息,例如Networking netlink_广播失败,返回值为-3,networking,kernel,kernel-module,broadcast,netlink,Networking,Kernel,Kernel Module,Broadcast,Netlink,我无法通过以下代码将netlink消息广播到用户空间。然而,我没有发现任何错误。我的用户空间程序可以接收其他类型的广播消息,例如sock\u fd=socket(PF\u NETLINK、sock\u RAW、NETLINK\u KOBJECT\u UEVENT),但不是我的类型SYSHOOK\u NL\u NUM 我认为bug隐藏在我的内核代码中。有人能找出什么问题吗?谢谢 syshook_nl_sk = netlink_kernel_create(&init_net, SYSH
sock\u fd=socket(PF\u NETLINK、sock\u RAW、NETLINK\u KOBJECT\u UEVENT)代码>,但不是我的类型SYSHOOK\u NL\u NUM
我认为bug隐藏在我的内核代码中。有人能找出什么问题吗?谢谢
syshook_nl_sk = netlink_kernel_create(&init_net, SYSHOOK_NL_NUM, 1, NULL, NULL, THIS_MODULE);
skb = alloc_skb(NLMSG_SPACE(nl_send_len), GFP_ATOMIC);
if(!skb) {
error = -ENOMEM;
goto err;
}
nlh = (struct nlmsghdr *)skb->data;
nlh->nlmsg_len = NLMSG_SPACE(nl_send_len);
nlh->nlmsg_pid = 0;
nlh->nlmsg_flags = 0;
nlh = nlmsg_put(skb, 0, 0, 0, NLMSG_SPACE(nl_send_len) - sizeof (struct nlmsghdr), 0);
NETLINK_CB(skb).pid = 0;
NETLINK_CB(skb).dst_group = 1;
error = netlink_broadcast(syshook_nl_sk, skb, 0, 1, GFP_KERNEL);
从内核接收广播消息的用户空间代码
sock_fd=socket(PF_NETLINK, SOCK_RAW, NETLINK_TEST);
// sock_fd=socket(PF_NETLINK, SOCK_RAW, 15);
if(sock_fd < 0) {
printf("create nl failed.\n");
return -1;
}
memset(&src_addr, 0, sizeof(src_addr));
memset(&msg, 0, sizeof(msg));
src_addr.nl_family = AF_NETLINK;
src_addr.nl_pid = 100; /* self pid */
/* interested in group 1<<0 */
src_addr.nl_groups = 1;
// setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));
bind(sock_fd, (struct sockaddr*)&src_addr, sizeof(src_addr));
memset(&dest_addr, 0, sizeof(dest_addr));
nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));
memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD));
iov.iov_base = (void *)nlh;
iov.iov_len = NLMSG_SPACE(MAX_PAYLOAD);
msg.msg_name = (void *)&dest_addr;
msg.msg_namelen = sizeof(dest_addr);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
char buf[1024] = {0};
printf("begin to recvmsg jiang \n");
int rcvlen;
while (1) {
/* Read message from kernel */
rcvlen = recv(sock_fd, &buf, sizeof(buf), 0);
// rcvlen = recvmsg(sock_fd, &msg, 0);
printf("--%d--%s\n",rcvlen, buf);
}
sock\u fd=socket(PF\u NETLINK,sock\u RAW,NETLINK\u测试);
//sock_fd=套接字(PF_NETLINK,sock_RAW,15);
if(sock_fd<0){
printf(“创建nl失败。\n”);
返回-1;
}
memset(&src_addr,0,sizeof(src_addr));
memset(&msg,0,sizeof(msg));
src_addr.nl_family=AF_NETLINK;
src_addr.nl_pid=100;/*自整定pid*/
/*对第1组感兴趣的sudo使其发挥作用。代码似乎还可以