天天看点

Netlink系列2Netlink socket地址结构

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发送多播。

继续阅读