`
shaojiashuai123456
  • 浏览: 262081 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

linux netlink通信

阅读更多

(1)加入自己的NETLINK通信端口

     在/usr/include/linux/netlink.h 中加入 NETLINK_TEST 20

2)用户层代码

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <string.h>

#include <linux/netlink.h>

#define NETLINK_TEST           20

  

struct netlink_data{ 

        struct nlmsghdr msg; 

        char data[1024]; 

}; 

  

int main() 

        struct netlink_data nldata; 

        struct nlmsghdr *msg = &nldata.msg; 

        int retval; 

        struct sockaddr_nl addr; 

        char *data = "hello world!\0"; 

        int size = strlen(data); 

        //创建socket

        int fd = socket(PF_NETLINK,SOCK_RAW,NETLINK_TEST); 

        if(fd<0)

        {

            printf("socket error");

            return 0;

        }

        //设置netlink消息头部信息

        memset(&nldata, '\0', sizeof(nldata)); 

        msg->nlmsg_len = NLMSG_LENGTH(size); //表示数据长度size+消息头部长度

        msg->nlmsg_type = 0; 

        msg->nlmsg_flags = 0; 

        msg->nlmsg_seq = 0; 

        //设置接收信息的地址

        addr.nl_family = AF_NETLINK; 

        addr.nl_pid = 0; 

        addr.nl_groups = 0; 

        //拷贝信息到消息头后面

        memcpy(NLMSG_DATA(msg), data, size); 

        //发送消息

        retval = sendto(fd, &nldata, msg->nlmsg_len, 0, 

                        (struct sockaddr*)&addr, sizeof(addr)); 

  

        close(fd); 

        return 0; 

(3)内核层代码

#include <linux/module.h>

#include <linux/init.h>

#include <net/sock.h>

#include <linux/netlink.h>

#include <linux/inet.h>

#include <linux/skbuff.h>

#define NETLINK_TEST 20

struct sock *nl_sk = NULL;

void test(struct sk_buff *__skb)

{

      struct sk_buff *skb;

      struct nlmsghdr *nlh;

      //获取对skb的引用指针

      skb=skb_get(__skb);

      if(skb->len<NLMSG_SPACE(0))

      {

           goto free;

      }

      nlh=(struct nlmsghdr *)skb->data;

      printk("msg:%s\n",(char *)NLMSG_DATA(nlh));

free:

      kfree_skb(skb);

}

static int __init netlink_init(void)

{

     //创建内核sock

     nl_sk=netlink_kernel_create(&init_net,NETLINK_TEST,0,test,NULL,THIS_MODULE);

     if(!nl_sk)

     {

         printk("netlink:can not create");

         return 0;

     }

     else

     {

      printk("netlink:create success!");

        return 1;

     }

}

static void __exit netlink_exit(void)

{

     if(nl_sk)

     {

           //回收内核sock

           netlink_kernel_release(nl_sk);

     }

}

MODULE_LICENSE("GPL");

module_init(netlink_init);

module_exit(netlink_exit);

(4)常用结构

struct sockaddr_nl

{

        sa_family_t     nl_family;      /* AF_NETLINK   */

        unsigned short  nl_pad;         /* zero         */

        __u32           nl_pid;         /* port ID      */

        __u32           nl_groups;      /* multicast groups mask */

};

struct nlmsghdr

{

        __u32           nlmsg_len;      /* Length of message including header */

        __u16           nlmsg_type;     /* Message content */

        __u16           nlmsg_flags;    /* Additional flags */

        __u32           nlmsg_seq;      /* Sequence number */

        __u32           nlmsg_pid;      /* Sending process port ID */

};

(5)nlmsghdr常用宏

#define NLMSG_HDRLEN  ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))//获取头部大小

#define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(NLMSG_HDRLEN))//获取头部+信息大小

#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len)) //获取分配空间大小

#define NLMSG_DATA(nlh)  ((void*)(((char*)nlh) + NLMSG_LENGTH(0))) //获取数据开始位置

<!--EndFragment-->
分享到:
评论

相关推荐

    支持多线程并发与消息异步处理的Linux Netlink通信机制研究.pdf

    "支持多线程并发与消息异步处理的Linux Netlink通信机制研究" Linux操作系统中,Netlink是一种流行的进程间通信机制,用于实现用户空间和内核空间之间的通信。然而,在多线程程序中使用Netlink时,仍然存在一些问题...

    linux netlink 示例代码: 通过net link 进行 内核和用户空间的数据通讯

    eknetlink.c -内核程序源码 netlink提供了一种很好很强大的的用户与内核之间的通讯机制,本文通过静态的新增一个netlink协议类型,并使用这个新的netlink类型实现用户态和内核态的双向通讯,对linux的netlink通讯...

    论文研究-基于Linux Netlink快速写入路由方法的设计与实现 .pdf

    基于Linux Netlink快速写入路由方法的设计与实现,刘鹏展,李昕,本文介绍了linux中一种用户程序与内核通信的一种方式:netlink,对比了netlink与其他内核通信方式的优点;给出了一种基于netlink通信方式来

    Netlink套接字在Linux系统通信中的应用研究.pdf

    Netlink套接字在Linux系统通信中的应用研究 Netlink套接字是一种基于Socket编程接口的通信机制,在Linux系统中发挥着至关重要的作用。作为一种相对新的进程间通信机制,Netlink套接字具有其自身的优势。本文将详细...

    linux内核态与用户态通信-netlink实例解析

    总结,Netlink是Linux内核与用户态通信的重要手段,它提供了高效、安全的消息传递机制。理解Netlink的工作原理和使用方法,对于开发需要与内核交互的应用程序至关重要。通过实践和分析源码,我们可以更好地利用...

    linux下netflink通信实例(内核2.6.25)

    在这个实例中,我们关注的是在Linux内核2.6.25版本下的Netlink通信。Netlink是内核模块和用户应用程序之间交互的一种特殊套接字类型,特别适合于系统管理、网络配置和安全日志等任务。 Netlink通信的核心在于创建和...

    linux内核通信-netlink使用例子.pdf

    Netlink 是Linux内核提供的一种通信机制,用于在内核空间和用户空间之间进行高效、灵活的数据交换。这种通信方式比传统的系统调用、ioctl或/proc文件系统更具有优势,因为它提供了异步通信、多播支持、模块化实现...

    Linux中netlink工信机制详解

    关于网络设备中netlink通信机制详解,主要为代码主题的实现

    linux用户空间和kernel两种常用通信方式

    本文档详细介绍了netlink和字符设备两种方式在用户空间和kernel通信的原理及代码,供大家参考,基于最新的kernel4.0

    Linux中与内核通信Netlink机制.pdf

    Linux中的Netlink机制是一种在用户空间应用程序和内核之间进行高效通信的方法。Netlink提供了一种消息传递的方式,使得用户态程序能够安全地与内核交互,传递数据和控制信息,而无需通过系统调用来完成所有的操作。...

    Linux 用户态与内核态的交互――netlink 篇

    在Linux 2.4及后续版本中,Netlink套接字成为了用户态和内核态交互的重要机制,尤其在处理中断过程与用户进程间的通信时表现突出。例如,iproute2这样的网络管理工具以及Netfilter包过滤框架都广泛使用了Netlink进行...

    linux中与内核通信的Netlink机制

    本文主要介绍linux中内核态与用户态通信的netlink机制。介绍了netlink的程序流程,特点,和具体实现代码

    Linux内核中netlink协议族的实现

    Netlink协议族是Linux内核中的一个重要组成部分,它主要用于用户空间(user space)与内核空间(kernel space)之间的通信。一旦在内核配置中选择了网络支持,Netlink就会自动包含在内,无法单独移除。 Netlink协议...

    Netlink实现Linux内核与用户空间通信

    Linux内核与用户空间通信的方式目前主要有9种,分别是内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file、debugfs和relayfs。Netlink是一种特殊的文件描述符(套结字),为2.6.14及更高...

    Linux中与内核通信Netlink机制.docx

    在Linux操作系统中,Netlink是一种重要的通信机制,它允许用户空间的应用程序与内核空间进行安全、高效的数据交换。Netlink最初设计是用来处理系统审计事件,但随着时间的发展,它的用途已经扩展到了各种需要内核与...

    基于netlink的linux服务器集群统一外设事件监听机制.pdf

    为解决这一问题,本文提出了一种基于netlink通信的服务器集群统一外设事件监听机制,旨在提高服务器集群的整体安全性。 Netlink是一种在内核和用户空间之间进行高效通信的机制,它允许用户空间程序接收和发送内核...

    netlink实现usb热插拔

    首先,netlink是Linux内核与用户空间之间的一种通信机制,它提供了安全、高效的接口,用于传递消息和事件。在USB热插拔场景中,内核可以通知用户空间有新的USB设备插入或被移除。通过创建一个netlink套接字,用户...

    netlink.rar_netlink_内核

    在Linux操作系统中,Netlink是一种通信机制,它允许用户空间应用程序与内核进行高效的数据交换。Netlink充当了用户空间和内核空间之间的桥梁,使得开发者可以实现自定义的协议或者进行内核功能的调用而无需编写内核...

    linux下用户程序同内核通信详解(netlink机制)

    Netlink是Linux内核提供的一种通信机制,允许用户空间应用程序和内核空间进行双向数据交换,而无需通过传统的系统调用、ioctl或/proc文件系统。 Netlink的优势在于: 1. **简单易用**:用户只需要在`include/linux/...

Global site tag (gtag.js) - Google Analytics