NETLINK 组播(多播)
NETLINK 单播方式是常用于一个用户进程和一个内核模块之间1:1的数据通信。是由用户空间作为消息的发起者。
NETLINK 组播方式是常用于一个内核模块和多个用户进程之间1:N的数据通信。是由内核空间作为消息的发起者。
如下我们对于使用NETLINK 组播(多播)方式时,在用户空间中调用bind()前的nl_pid和nl_groups含义做下说明:
struct sockaddr_nl
{
sa_family_t nl_family; /* 该字段总是为AF_NETLINK */
unsigned short nl_pad; /* 目前未用到,填充为0 */
__u32 nl_pid; /* process pid */
__u32 nl_groups; /* multicast groups mask */
};
1 nl_pid:
作为bind()的参数时,nl_pid就是给没有标识的socket_fd赋上一个唯一的本地标识。“唯一”是指:当有多个socket_df时要保证socket_df唯一性。
当一个进程只需要一个Netlink socket_fd时可以指定nl_pid为任意32位整数,nl_pid = getpid();是个不错的选择。但是当一个进程中的不同线程需要同一个Netlink协议的多个Netlink socket_fd时,就不能都指定为nl_pid = getpid();,必须加以区别,而通过pthread_self() << 16 | getpid();使同一个进程中的不同线程可以有同一种Netlink协议类型的Netlink socket_fd。事实上,即使在同一个线程中,可能会存在使用同一种协议类型的多个套接字,开发者必须要更有创造力来产生一个唯一的nl_pid。
2 nl_groups:
作为bind()的参数时,nl_groups的值是多播组的掩码(注意不是多播组的组号)。如果应用进程想接受发送给特定多播组的Netlink消息,所有感兴趣的多播组bit应该or在一起,并填充到nl_groups域。否则, nl_groups应该被显式至零,说明该应用进程不加入任何多播组。
阅读(3899) | 评论(0) | 转发(0) |