Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1743361
  • 博文数量: 143
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1462
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-23 11:14
文章分类

全部博文(143)

文章存档

2022年(3)

2021年(13)

2020年(21)

2019年(8)

2018年(28)

2017年(7)

2016年(63)

我的朋友

分类: 嵌入式

2018-10-06 09:24:26

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应该被显式至零,说明该应用进程不加入任何多播组。
阅读(3860) | 评论(0) | 转发(0) |
0

上一篇:LTE MAC和TCP/IP MAC

下一篇:双向链表

给主人留下些什么吧!~~