netlink学习
netlink是什么
`netlink`是Linux内核中的一种进程间通信(IPC)机制。它允许内核空间与用户空间之间,以及用户空间进程之间进行双向通信。
内核里的很多子系统使用`netlink`通信,包括网络管理(Routing,Netfilter),设备驱动管理(udev)以及安全审计(auditd)。`netlink`套接字类似于一个消息队列:用户空间进程可以向内核发送命令或请求,内核也可以通过`netlink`套接字向用户空间发送通知和数据。
在网络编程模型中,`netlink`套接字是特殊类型的套接字,它们使用`AF_NETLINK`作为其地址族。跟UNIX域套接字不同的是,`netlink`套接字并不依赖于文件系统,而是依赖于进程ID和`netlink`协议类型。
以下是一个使用`netlink`套接字创建一个socket的例子:
#include <sys/socket.h>
#include <linux/netlink.h>int sock_fd= socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
在这个例子中,`NETLINK_ROUTE`参数表明我们打算使用`netlink`来获取和修改路由表信息。
当一个进程创建了一个netlink套接字后,它可以使用标准的`sendmsg`和`recvmsg`调用来发送和接收消息。消息的格式由对应的netlink协议来定义。
注意,使用`netlink`通常需要一些系统编程的知识,包括socket编程、数据结构和内存管理等。如果你想避免直接使用`netlink`,你可以选择使用封装了`netlink`的用户空间库,如`libnl`或者`libmnl`。
netlink与unix套接字的区别
`netlink`和`UNIX`套接字都是Linux系统中进行进程间通信(IPC)的机制,但它们之间有一些关键的区别:
1. **通信范围:** `UNIX`套接字主要用于同一台机器上的进程间通信,也就是本地IPC。相比之下,`netlink`套接字不仅可以用于用户空间进程之间的通信,还可以用于用户空间进程和内核之间的通信。
2. **依赖:** `UNIX`套接字依赖于文件系统,它们使用文件系统路径作为地址。`netlink`套接字则不依赖于文件系统,它们使用进程ID和`netlink`协议类型作为地址。
3. **使用场景:** `UNIX`套接字主要用于通用的IPC场景,例如,两个进程需要共享数据或者同步操作。相比之下,`netlink`套接字主要用于特定的系统管理和监控任务,例如,获取和修改网络路由表,接收设备状态改变的通知,或者执行安全审计。
4. **数据传输:** `UNIX`套接字可以使用`stream`(SOCK_STREAM)或`datagram`(SOCK_DGRAM)模式传输数据,分别提供了有序、可靠的字节流和无序、不可靠的消息。`netlink`套接字只支持`datagram`模式,它提供无序、不可靠的消息传输。
5. **API接口:** 尽管`netlink`和`UNIX`套接字都使用标准的套接字API(如`socket()`, `bind()`, `send()`, `recv()`等),但`netlink`消息的格式和解析方法与通常的套接字不同。一般来说,使用`netlink`需要更深入的系统编程知识,对于复杂的任务,可能需要使用专门的库,如`libnl`或`libmnl`。
总的来说,`netlink`和`UNIX`套接字都是强大的通信工具,但它们适用于不同的场景。选择使用哪种通信机制主要取决于你的具体需求。
libnl和libmnl是什么,如何使用
`libnl`和`libmnl`都是用来简化用户空间进程与Linux内核通过`netlink`套接字通信的库。它们提供了一套高级的API接口,使得开发人员不必直接处理`netlink`的底层细节。
**libnl**
`libnl`是一个全功能的`netlink`库,它提供了许多高级功能和便利函数,如对象抽象、错误处理和消息队列等。然而,这些特性也使得`libnl`相比较复杂且庞大,它的学习曲线可能会相对较陡。
使用`libnl`的基本步骤如下:
1. 创建`netlink`套接字。
2. 构造要发送的`netlink`消息。
3. 发送消息并接收回应。
4. 解析收到的回应消息。
以下是一个使用`libnl`获取网络链接列表的简单例子:
#include <netlink/netlink.h>
#include <netlink/socket.h>struct nl_sock *sock;// 创建netlink套接字
sock = nl_socket_alloc();// 连接内核
nl_connect(sock, NETLINK_ROUTE);// 发送请求以获取链接列表
nl_rtgen_request(sock, RTM_GETLINK, AF_UNSPEC, NLM_F_DUMP);// ...
// 接收和处理回应消息
// ...// 释放套接字
nl_socket_free(sock);
**libmnl**
与`libnl`不同,`libmnl`是一个轻量级的`netlink`库,它只提供了最基础的功能。`libmnl`并没有提供`libnl`那样的高级特性,但其API更简单,易于学习,且几乎没有额外开销。
以下是一个使用`libmnl`发送一个简单`netlink`消息的例子:
#include <libmnl/libmnl.h>
#include <linux/netlink.h>struct mnl_socket *nl;// 创建netlink套接字
nl = mnl_socket_open(NETLINK_ROUTE);// 绑定套接字
mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID);// ...
// 构造并发送消息
// ...// 释放套接字
mnl_socket_close(nl);
总的来说,`libnl`和`libmnl`都是有用的工具,它们让开发人员能更容易地使用`netlink`进行编程。选择哪一个库主要取决于你的需求—如果你需要一些高级特性,或者希望库能处理更多的底层细节,那么`libnl`可能是更好的选择。但如果你想要一个轻量级、基础的库,那么`libmnl`可能会更适合你。
相关文章:

netlink学习
netlink是什么 netlink是Linux内核中的一种进程间通信(IPC)机制。它允许内核空间与用户空间之间,以及用户空间进程之间进行双向通信。 内核里的很多子系统使用netlink通信,包括网络管理(Routing,Netfilt…...

地理空间分析10——空间数据分析中的地理编码与Python
目录 写在开头1. 地理编码基础1.1 地理编码的基本原理1.1.1 坐标系统1.1.2 地名解析1.1.3 编码算法1.2 Python中使用地理编码的基础知识1.2.1 百度地图API1.2.2 高德地图API1.2.3 腾讯地图API1.3 Python中实现代码2. 逆地理编码2.1 利用Python进行逆地理编码2.1.1 获取高德地图…...

使用“快速开始”将数据传输到新的 iPhone 或 iPad
使用“快速开始”将数据传输到新的 iPhone 或 iPad 使用 iPhone 或 iPad 自动设置你的新 iOS 设备。 使用“快速开始”的过程会同时占用两台设备,因此请务必选择在几分钟内都不需要使用当前设备的时候进行设置。 确保你当前的设备已连接到无线局域网,并…...

计算机网络(第六版)复习提纲13
前同步码,七位1010交替出现,帧开始码:10101011 为什么没有帧结束?曼彻斯特码传播完成后,维持高电平,不再跳变,因此不必要设置帧结束。 3.无效的MAC帧 i.数据字段的长度与长度字段的值不一致&…...

[office] excel2010双向条形图制作 #经验分享#微信
excel2010双向条形图制作 本教程为大家介绍一下excel2010中excel2010双向条形图制作方法。 1.选中工作区域 2.点击插入-->图表,选择条形图 3.为美观可将中间竖线可去掉 4.方法是选中竖线,右击-->删除 5.接下来将图例靠上,选中图例,右击-->设置图例格式-->图例选项…...

优雅管理多线程异步任务 - 永动异步任务
引言 在现代应用程序中,经常需要处理长时间运行的异步任务,如消息推送、定时任务等。为了确保这些异步任务能够安全可靠地执行,我们需要一种优雅的管理方式。本文将介绍一种基于线程池的多线程异步任务管理方案,并详细讨论任务的优雅关闭。 1. 多线程异步任务管理的需求 …...

软考笔记--分布式数据库
分布式数据库系统是数据库技术与网络技术相结合的产物,其基本思想是将传统的集中式数据库中的数据分布于网络上的多台计算机中。分布式数据库系统通常使用较小的计算机系统,每台计算机可单独放在一个地方,每台计算机中都有DBMS的一份完整的复…...

vue项目中路由懒加载的三种方式
1 . vue异步组件技术 异步加载 vue-router配置路由 , 使用vue的异步组件技术 , 可以实现按需加载 . 但是,这种情况下一个组件生成一个js文件 /* vue异步组件技术 */ { path: /home, name: home, component: resolve > require([/components/home],resolve) }, { path…...

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏6(附项目源码)
本节最终效果演示 文章目录 本节最终效果演示系列目录前言生命 食物 水简单绘制UI玩家状态脚本生命值控制饱食度控制水分控制 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中…...

Cache Lab:Part A【模拟出使用LRU策略的高速缓存存储器组织结构】
目录 任务描述 知识回顾 实验内容 测试结果 Cache Lab 对应《CS:APP》6.3节至第六章结束的内容。 任务描述 Your job for Part A is to fill in the csim.c file so that it takes the same command line arguments and produces the identical output as the reference …...

操作系统基础:死锁
🌈个人主页:godspeed_lucip 🔥 系列专栏:OS从基础到进阶 🐦1 死锁的概念🦢1.1 总览🦢1.2 什么是死锁🦢1.3 死锁、饥饿、死循环的区别🐧1.3.1 概念🐧1.3.2 区别…...

Ubuntu server如何使用 Daphne + Nginx + supervisor部署 Django
Django从 3.0版开始加入对ASGI的支持,使Django开始具有异步功能。 截止目前的5.0版,对异步支持逐步也越来越好,相信在未来的版本中异步将会支持的更加完善。 所以说,我们也需要适时的更新我们的技能,学会在asgi异步服务器环境中部署django项目! 在部署之前我们所有的依…...

Android 12.0 应用中监听系统收到的通知
1. 需求 在系统内置应用中或者在第三方应用中,获取Android系统收到的通知的内容. 2. NotificationListenerService 接口 Android 系统预留了专门的API, 即 NotificationListenerService 接口,它的源码路径为: 源码路径 : /frameworks/base/core/java/android/service/notifi…...

SpringBoot+Redis如何实现用户输入错误密码后限制登录(含源码)
点击下载《SpringBootRedis如何实现用户输入错误密码后限制登录(含源码)》 1. 引言 在当今的网络环境中,保障用户账户的安全性是非常重要的。为了防止暴力破解和恶意攻击,我们需要在用户尝试登录失败一定次数后限制其登录。这不…...

kotlin中的初始化问题纪录
1. init 代码块的顺序问题 init代码块和成员变量实质上是按先后顺序执行的。若果init{} 中有成员变量使用。要把成员变量放到代码块之前。 2. init代码块之中的函数问题 下面是一段错误的代码: class mkotlin{val info:Stringinit {getInfoMethod()info "adad…...

Web中的转发与重定向
转发与重定向 一、转发和重定向的概念1.转发2.重定向 二、JavaWeb 中的转发和重定向三、SpringMVC 中的转发和重定向1.转发(1) 默认的方式(2) 完整的方式 2.重定向 四、总结 一、转发和重定向的概念 在 Web 应用中,转发和重定向都是用于将请求从一个页面传递到另一…...

交叉注意力融合时域、频域特征的FFT + CNN-Transformer-CrossAttention轴承故障识别模型
目录 往期精彩内容: 前言 1 快速傅里叶变换FFT原理介绍 第一步,导入部分数据 第二步,故障信号可视化 第三步,故障信号经过FFT可视化 2 轴承故障数据的预处理 2.1 导入数据 2.2 制作数据集和对应标签 3 交叉注意力机制 …...

STM32读取MPU6050数据并通过角度值控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机)
通过STM32F103C8T6读取MPU6050数据控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机) 最终现象一、MPU6050数据读取二、舵机控制原理①什么是PWM?②STM32F103C8T6如何生成PWM?③控制舵机需要什么样的PWM波? 三…...

Unity_Playable工具使用
Unity_Playable工具使用 目录 Unity_Playable工具使用 1. Default Playables(Timeline扩展) 2. PlayableGraph Visualizer&#x...

Flutter canvas 画一条波浪线 进度条
之前用 Flutter Canvas 画过一个三角三角形,html 的 Canvas 也画过一次类似的, 今天用 Flutter Canvas 试了下 感觉差不多: html 版本 大致效果如下: 思路和 html 实现的类似: 也就是找出点的位置,使用二阶…...

Java技术栈 —— Spring MVC 与 Spring Boot
参考文章或视频链接[1] Spring vs. Spring Boot vs. Spring MVC[2] Key Differences Between Spring vs Spring Boot vs Spring MVC...

跟着cherno手搓游戏引擎【16】Camera和Uniform变量的封装
相机封装: OrthographicCamera.h: #pragma once #include <glm/glm.hpp> namespace YOTO {class OrthographicCamera{public:OrthographicCamera(float left,float right , float bottom,float top);const glm::vec3& GetPosition()const { return m_Pos…...

微服务中间件 RabbitMq学习
1、为什么需要Mq 例如在用户注册业务中,用户注册成功后 需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式;2.并行的方式 ; 假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间10…...

3D Gaussian Splatting-实时辐射场渲染技术
引用自:https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_high.pdf 概述: 该论文介绍了一种用于实时辐射场渲染的3D高斯点渲染技术。 其基本原理是: 一:首先从SfM校准的图像及其对应的稀疏点云…...

vue中nextTick()
在 Vue.js 中,nextTick() 是一个非常有用的方法,用于在下一个 DOM 更新循环结束后执行延迟回调。这在你需要读取或写入刚刚更新的 DOM 时非常有用。 下面是一个简单的示例代码,用于解析 nextTick() 的用法: <template> &…...

Redis 布隆过滤器
布隆过滤器 这一篇文章主要是记录布隆过滤器的使用和认识 主要参考了如下的blog https://blog.csdn.net/weixin_42972832/article/details/131211665 他讲的还不错 简单的来说,布隆过滤器,实际上就像是一个集合,拿redis的key来举例来说,布隆过滤器的设置就是去过滤不属于redi…...

中国的茶文化:现代生活中的茶文化
中国的茶文化:现代生活中的茶文化 引言 在现代社会的快节奏生活中,茶文化并未随时间流逝而褪色,反而以其独特的方式融入了全球各地人们的日常生活。它超越了饮品本身的范畴,成为一种连接历史、人文与现代生活方式的艺术形式。本文…...

Python正则表达式语法
正则表达式是一种强大的文本处理工具,它可以用来搜索、匹配和替换特定的字符模式。在Python中,正则表达式常常被用于处理字符串数据,例如文本搜索、数据提取、格式验证等任务。本文将深入介绍Python中正则表达式的语法,帮助读者全…...

C++核心编程:文件操作 笔记
5.文件操作 程序运行时产生的数据都属于临时数据,程序一旦允许结束都会被释放。通过文件可以将数据持久化 C中对文件操作需要包含头文件<fstream> 文件类型分为两种: 文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文本…...

ElementUI组件:Button 按钮
ElementUI安装与使用指南 Button按钮 点击下载learnelementuispringboot项目源码 效果图 el-button.vue页面效果图 项目里el-button.vue代码 <script> export default {name: "el_button",// 注意这里的名称不能和 router inex.js里的name一样methods: {s…...