Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Networking netlink_广播失败,返回值为-3_Networking_Kernel_Kernel Module_Broadcast_Netlink - Fatal编程技术网

Networking netlink_广播失败,返回值为-3

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

我无法通过以下代码将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, 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使其发挥作用。代码似乎还可以