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