(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通信机制研究" Linux操作系统中,Netlink是一种流行的进程间通信机制,用于实现用户空间和内核空间之间的通信。然而,在多线程程序中使用Netlink时,仍然存在一些问题...
eknetlink.c -内核程序源码 netlink提供了一种很好很强大的的用户与内核之间的通讯机制,本文通过静态的新增一个netlink协议类型,并使用这个新的netlink类型实现用户态和内核态的双向通讯,对linux的netlink通讯...
基于Linux Netlink快速写入路由方法的设计与实现,刘鹏展,李昕,本文介绍了linux中一种用户程序与内核通信的一种方式:netlink,对比了netlink与其他内核通信方式的优点;给出了一种基于netlink通信方式来
Netlink套接字在Linux系统通信中的应用研究 Netlink套接字是一种基于Socket编程接口的通信机制,在Linux系统中发挥着至关重要的作用。作为一种相对新的进程间通信机制,Netlink套接字具有其自身的优势。本文将详细...
总结,Netlink是Linux内核与用户态通信的重要手段,它提供了高效、安全的消息传递机制。理解Netlink的工作原理和使用方法,对于开发需要与内核交互的应用程序至关重要。通过实践和分析源码,我们可以更好地利用...
在这个实例中,我们关注的是在Linux内核2.6.25版本下的Netlink通信。Netlink是内核模块和用户应用程序之间交互的一种特殊套接字类型,特别适合于系统管理、网络配置和安全日志等任务。 Netlink通信的核心在于创建和...
Netlink 是Linux内核提供的一种通信机制,用于在内核空间和用户空间之间进行高效、灵活的数据交换。这种通信方式比传统的系统调用、ioctl或/proc文件系统更具有优势,因为它提供了异步通信、多播支持、模块化实现...
关于网络设备中netlink通信机制详解,主要为代码主题的实现
本文档详细介绍了netlink和字符设备两种方式在用户空间和kernel通信的原理及代码,供大家参考,基于最新的kernel4.0
Linux中的Netlink机制是一种在用户空间应用程序和内核之间进行高效通信的方法。Netlink提供了一种消息传递的方式,使得用户态程序能够安全地与内核交互,传递数据和控制信息,而无需通过系统调用来完成所有的操作。...
在Linux 2.4及后续版本中,Netlink套接字成为了用户态和内核态交互的重要机制,尤其在处理中断过程与用户进程间的通信时表现突出。例如,iproute2这样的网络管理工具以及Netfilter包过滤框架都广泛使用了Netlink进行...
本文主要介绍linux中内核态与用户态通信的netlink机制。介绍了netlink的程序流程,特点,和具体实现代码
Netlink协议族是Linux内核中的一个重要组成部分,它主要用于用户空间(user space)与内核空间(kernel space)之间的通信。一旦在内核配置中选择了网络支持,Netlink就会自动包含在内,无法单独移除。 Netlink协议...
Linux内核与用户空间通信的方式目前主要有9种,分别是内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file、debugfs和relayfs。Netlink是一种特殊的文件描述符(套结字),为2.6.14及更高...
在Linux操作系统中,Netlink是一种重要的通信机制,它允许用户空间的应用程序与内核空间进行安全、高效的数据交换。Netlink最初设计是用来处理系统审计事件,但随着时间的发展,它的用途已经扩展到了各种需要内核与...
为解决这一问题,本文提出了一种基于netlink通信的服务器集群统一外设事件监听机制,旨在提高服务器集群的整体安全性。 Netlink是一种在内核和用户空间之间进行高效通信的机制,它允许用户空间程序接收和发送内核...
首先,netlink是Linux内核与用户空间之间的一种通信机制,它提供了安全、高效的接口,用于传递消息和事件。在USB热插拔场景中,内核可以通知用户空间有新的USB设备插入或被移除。通过创建一个netlink套接字,用户...
在Linux操作系统中,Netlink是一种通信机制,它允许用户空间应用程序与内核进行高效的数据交换。Netlink充当了用户空间和内核空间之间的桥梁,使得开发者可以实现自定义的协议或者进行内核功能的调用而无需编写内核...
Netlink是Linux内核提供的一种通信机制,允许用户空间应用程序和内核空间进行双向数据交换,而无需通过传统的系统调用、ioctl或/proc文件系统。 Netlink的优势在于: 1. **简单易用**:用户只需要在`include/linux/...