为了发送一条netlink消息到内核或者其他的用户空间进程,另外一个struct sockaddr_nl nladdr需要作为目的地址,这和使用sendmsg()发送一个UDP包是一样的。 如果该消息是发送至内核的,那么nl_pid和nl_groups都置为0. 如果消息是发送给另一个进程的单播消息,nl_pid是另外一个进程的pid值而nl_groups为零。 如果消息...
struct netlink_kernel_cfg,如下所示该结构体包含了内核netlink的可选参数,其中groups用于指定最大的多播组;flags成员可以为NL_CFG_F_NONROOT_RECV或NL_CFG_F_NONROOT_SEND,这两个符号前者用来限定非超级用户是否可以绑定到多播组,后者用来限定非超级用户是否可以发送组播;input指针用于指定回调函数,该回调函数用于接...
nl_pid为netlink套接字的单播地址,在发送消息时用于表示目的套接字的地址,在用户空间绑定时可以指定为当前进程的PID号。nl_groups表示组播组。在发送消息时用于表示目的多播组,在绑定地址时用于表示加入的多播组。这里nl_groups为一个32位无符号数,其中的每一位表示一个 多播组,一个netlink套接字可以加入多个多播...
src_addr.nl_family=PF_NETLINK; src_addr.nl_pid = 0;//表示我们要从内核接收多播消息。注意:该字段为0有双重意义,另一个意义是表示我们发送的数据的目的地址是内核。 src_addr.nl_groups=netlink_group_mask(atoi(argv[1]));//多播组的掩码,组号来自我们执行程序时输入的第一个参数 //因为我们要加入...
也就是说,在用户空间的代码里,如果我们要加入到多播组1,需要设置nl_groups设置为1;多播组2的掩码为2;多播组3的掩码为4,依次类推。为0表示我们不希望加入任何多播组。理解这一点很重要。所以我们可以在用户空间也定义一个类似于netlink_group_mask()的功能函数,完成从多播组号到多播组掩码的转换。最终用户空间...
__u32 nl_groups;/* multicast groups mask */ }; (1) nl_pid:在Netlink规范里,PID全称是Port-ID(32bits),其主要作用是用于唯一的标识一个基于netlink的socket通道。通常 情况下nl_pid都设置为当前进程的进程号。前面我们也说过,Netlink不仅可以实现用户-内核空间的通信还可使现实用户空间两 ...
__u32 nl_groups; /* multicast groups mask */ }; (1) nl_pid:在Netlink规范里,PID全称是Port-ID(32bits),其主要作用是用于唯一的标识一个基于netlink的socket通道。通常 情况下nl_pid都设置为当前进程的进程号。前面我们也说过,Netlink不仅可以实现用户-内核空间的通信还可使现实用户空间两 ...
字段 nl_groups 用于指定多播组,bind 函数用于把调用进程加入到该字段指定的多播组,如果设置为 0,表示调用者不加入任何多播组。 传递给 bind 函数的地址的 nl_pid 字段应当设置为本进程的进程 ID,这相当于 netlink socket 的本地地址。但是,对于一个进程的多个线程使用 netlink socket 的情况,字段 nl_pid 则...
2. sockaddr_nl结构:为Netlink的地址,类似socket编程中的sockaddr_in,包含nl_pid和nl_groups两个重要字段。nl_pid用于唯一标识Netlink通道,nl_groups用于加入多播组。3. nlmsghdr结构:Netlink消息头,包含消息的长度、类型和附加说明信息。nlmsg_len表示整个消息的长度;nlmsg_type表示消息类型,如NLMSG...
nl_pid:单播地址。 对于内核netlink套接字:该值为0。 用户空间:当前进程id nl_groups:组播组,或组播组掩码。为0表示不加入任何多播组,最多支持32个多播组 2.2 netlink_kernel_cfg 功能:包含用于创建netlink套接字的可选参数 结构: netlink_kernel_cfg ...