代码之家  ›  专栏  ›  技术社区  ›  river

netlink广播失败,返回值为-3

  •  0
  • river  · 技术社区  · 6 年前

    我无法通过以下代码将netlink消息广播到用户空间。但是,我没有发现任何错误。例如,我的用户空间程序可以接收其他类型的广播消息 sock_fd=socket(PF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT); 但不是我喜欢的类型 SYSHOOK_NL_NUM .

       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);
        }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   river    6 年前

    sudo让它工作。好像密码没问题。