linux netlink

来源:互联网 发布:caxa自动编程 编辑:程序博客网 时间:2024/05/17 23:53

出处:http://www.ibm.com/developerworks/cn/linux/l-kerns-usrs/#N10180

struct sockaddr_nl

{

        sa_family_t         nl_family;

        unsigned short   nl_pad;

        __u32                  nl_pid;

        __u32                  nl_groups;

};


字段nl_family必须设置为AF_NETLINK(PF_NETLINK);

字段 nl_pad 当前没有使用,因此要总是设置为 0;

字段 nl_pid 为接收或发送消息的进程的 ID,如果希望内核处理消息或多播消息,就把该字段设置为 0,否则设置为处理消息的进程 ID;

字段 nl_groups 用于指定多播组;

bind 函数用于把调用进程加入到该字段指定的多播组,如果设置为 0,表示调用者不加入任何多播组;


传递给 bind 函数的地址的 nl_pid 字段应当设置为本进程的进程 ID,这相当于 netlink socket 的本地地址。但是,对于一个进程的多个线程使用 netlink socket 的情况,字段 nl_pid 则可以设置为其它的值,如:


pthread_self() << 16 | getpid();


为了发送一个 netlink 消息给内核或其他用户态应用,需要填充目标 netlink socket 地址,此时,字段 nl_pid 和 nl_groups 分别表示接收消息者的进程 ID 与多播组。如果字段 nl_pid 设置为 0,表示消息接收者为内核或多播组,如果 nl_groups为 0,表示该消息为单播消息,否则表示多播消息。

原创粉丝点击