大家好,我正在尝试实现网络链接用户代码和内核代码,对于单播来说一切正常(src_addr.nl_groups = 0;)。对于mulicast,对于非零的src_addr.nl_groups值,用户代码绑定(bind)调用始终会失败。真的不确定为多播赋予什么值(value)以及如何进一步进行。我在内核源代码树中检查了netlink_broadcast的用法,因此在此放置了相同的组ID值(RTMGRP_LINK)。对于单播,我在Internet上找到了很多帮助,但对于多播,我却不这么认为。因此,请帮助我进一步进行操作。

错误得到的是:

绑定(bind):没有这样的文件或目录

./a.out:无法绑定(bind)套接字(3)和err:-1:无此类文件或目录

#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdio.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#define NETLINK_TEST 28
#define GROUP_IB 1
#define MAX_PAYLOAD 1024
struct sockaddr_nl src_addr, dst_addr;
struct nlmsghdr *nlh = NULL;
struct msghdr msg;
struct iovec iov;
int sock_fd;


int main(int argc, char ** argv)
{
    int err;
    sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_TEST);
    if (sock_fd<0) {
            char s[BUFSIZ];
            sprintf( s, "%s: can't assign fd for socket", argv[0] );
            perror(s);
            return -1;
    }

    memset(&src_addr, 0, sizeof(src_addr));
    src_addr.nl_family = AF_NETLINK;
    src_addr.nl_pid = getpid();
    src_addr.nl_groups = 0; // Unicast
    //src_addr.nl_groups = RTMGRP_LINK; /* Multicast, bind call always fails for non zero values */

    err = bind(sock_fd, (struct sockaddr*)&src_addr, sizeof(src_addr));
    perror("bind");
    if (err<0) {
            char s[BUFSIZ];
            sprintf( s, "%s: can't bind socket (%d)and err : %d", argv[0], sock_fd,err );
            perror(s);
            return -1;
    }

    memset(&dst_addr, 0, sizeof(dst_addr));
    nlh = (struct nlhmsghdr *) 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 *)&dst_addr;
    msg.msg_namelen = sizeof(dst_addr);
    msg.msg_iov = &iov;
    msg.msg_iovlen = 1;


    printf("pid : %d\n Waiting for messages from kernel...\n",getpid());
    recvmsg(sock_fd, &msg, 0);
    printf("Message : %s\n", NLMSG_DATA(nlh));
    close(sock_fd);

    return 0;

}

最佳答案

Netlink套接字绑定(bind)对您所使用的用户很敏感-我已经看到,如果您没有以“root”身份运行有问题的程序(至少在RedHat 6上),它们确实会失败。

在更改逻辑之前,请尝试以root 1st身份运行。如果遇到与正常操作相同的故障,那么您就知道这不是(必要)权限问题。

08-17 18:59
查看更多