天天看點

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發送多點傳播。

繼續閱讀