Netlink socket用到的结构体如下:
Struct sockaddr_nl {
sa_family_t nl_family; //AF_NETLINK 或PF_NETLINK
unsigned short nl_pad; //保留,为0
__u32 nl_pid; //port ID
__u32 nl_groups; //多播组掩码
} nladdr;
Nl_family: 总是AF_NETLINK
Nl_pad: 保留,总是置0
nl_pid:
1.当作为bind函数的参数时,就是给没有名字的socketfd赋上一个名字,只有一个要求在有多个Netlink socketfd时要保证唯一性,方式一:由用户保证唯一性:一个进程只有一个Netlink socketfd时可以指定nl_pid为任意整数,getpid()是个不错的选择。但是一个进程有多个Netlink socketfd时就不能都指定为getpid(),必须加以区别。方式二:man手册指出当把nl_pid赋为0,无论一个进程内有几个 Netlink socketfd,内核将保证他们唯一性。
2.作为sendto等函数的参数:是用来指定发送数据目的地,当目的地是其他的进程,就赋上那个进程的pid就可,这个几乎用不到。当放送到内核,直接赋为0.
nl_groups:
对于Netlink 的每个协议,都有一个容纳32个多播组的集合。nl_groups的一个二进制位代表一个组,共有32个。
1.作为bind 函数的参数,用于把调用进程加入到该nl_groups指定的多播组(是否可以同时被添加进多个组,就是nl_groups多位为1,未验证),如果设置为 0,表示调用者不加入任何多播组。
2.作为sendto等函数的参数时。若nl_groups为0,配合nl_pid发送单播数据,当nl_groups不为0,配合nl_pid发送多播。