用户空间与内核的通信方式之netlink

用户空间与内核通信方式主要有两种:/proc和netlink

netlink涉及的数据结构

 struct msghdr {
            void            *msg_name;               //数据包目的地址(对应sockaddr_in)
            int             msg_namelen;             //数据包长度(sizeof(目的地址))
            struct iovec    *msg_iov;                //消息内容(指向struct iovec)
            __kernel_size_t msg_iovlen;              //msghdr中允许一次传递多个buff,以数组的形式组织在 msg_iov中,msg_iovlen就记录数组的长度(即有多少个buff)
            void            *msg_control;            //控制信息
            __kernel_size_t msg_controllen;          //
            unsigned        msg_flags;               //传入参数的flag

};

 

struct sockaddr_nl {
    __kernel_sa_family_t    nl_family;          /* AF_NETLINK   */
    unsigned short          nl_pad;             /* zero     */
    __u32                   nl_pid;             /* 进程id  */
    __u32                   nl_groups;          /* 是否是组播 */
};

 

struct iovec{
  void *iov_base;          /* 指向nlmsghdr的数据 */
  size_t iov_len;          /* 数据的长度 */
};

 

struct nlmsghdr {
    __u32       nlmsg_len;      /* Length of message including header */
    __u16       nlmsg_type;     /* 信息内容 */
    __u16       nlmsg_flags;    /* Additional flags */
    __u32       nlmsg_seq;      /* Sequence number */
    __u32       nlmsg_pid;      /* 发送进程的id */
};


用户空间的发送和接收

1. 创建AF_NETLINK的socket

2. 设置源地址信息(sockaddr_nl结构)

3. 绑定socket和源地址

4. 填充发送信息内容(msghdr结构:包含目的地址信息,发送信息内容(nlmsghdr结构))

如果是发送则5

5. sendmsg(套接字,信息内容)

否则是接收则6

6. recvmsg(套接字,信息内容)

 


 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值