linux netlink套接字学习资料
理论:
http://blog.csdn.net/unbutun/article/details/3394061
进一步深入:
http://edsionte.com/techblog/archives/4134
http://edsionte.com/techblog/archives/4140
http://edsionte.com/techblog/archives/4134
实践:
http://bbs.chinaunix.net/thread-3766684-1-1.html
附录代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <asm/types.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <linux/inet_diag.h>
#include <netinet/tcp.h> #define NETLINK_TEST 18
#define MAX_PAYLOAD 1024
struct req {
struct nlmsghdr nlh;
char [MAX_PAYLOAD];
}; void eprint(int err_no, char *str, int line)
{
printf("Error %d in line %d:%s() with %s\n", err_no, line, str, strerror(errno));
}
int main()
{
int sock_fd;
sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_TEST);
if (sock_fd < 0) {
eprint(errno, "socket", __LINE__);
return errno;
}
//将本地套接字与源地址绑定
struct sockaddr_nl src_addr;
memset(&src_addr, 0, sizeof(src_addr));
src_addr.nl_family = AF_NETLINK;
src_addr.nl_pid = getpid(); //nl_pid字段指明发送消息一方的pid
src_addr.nl_groups = 0; //nl_groups表示多播组的掩码 这里我们并没有涉及多播。因此默觉得0 if (bind(sock_fd, (struct sockaddr *)&src_addr, sizeof(src_addr)) < 0) {
eprint(errno, "bind", __LINE__);
return errno;
} //绑定了套接字之后。用户进程终于发送的是msghdr结构的消息,因此必须对这个结构进行初始化,
//而msghdr结构又与
//初始化msghdr结构 sockaddr_nl。iovec和nlmsghdr三个结构相关。因此必须依次对这些数据结构进行初始化
/*
struct msghdr {
void * msg_name; // Socket name
int msg_namelen; //Length of name
struct iovec * msg_iov; // Data blocks
__kernel_size_t msg_iovlen; // Number of blocks
void * msg_control; // Per protocol magic (eg BSD file descriptor passing)
__kernel_size_t msg_controllen; // Length of cmsg list
unsigned msg_flags;
};*/
/*
struct sockaddr_nl {
__kernel_sa_family_t nl_family; // AF_NETLINK
unsigned short nl_pad; //zero
__u32 nl_pid; // port ID
__u32 nl_groups; // multicast groups mask
};*/ struct sockaddr_nl dest_addr;
memset(&dest_addr, 0, sizeof(dest_addr));
dest_addr.nl_family = AF_NETLINK;
dest_addr.nl_pid = 0; //即nl_pid必须为0,表示接收方为内核。 dest_addr.nl_groups = 0;
//req类型的数据报进行初始化。即依次对其封装的两个数据结构初始化: struct req r;//自己定义协议数据结构 使用netlink进行用户进程和内核的数据交互时 用到
r.nlh.nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD); /*这里的nlmsg_len为为sizeof(structnlmsghdr)+MAX_PAYLOAD的总和。 宏NLMSG_SPACE会自己主动将两者的长度相加
#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN)
#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len)) */ r.nlh.nlmsg_pid = getpid();
r.nlh.nlmsg_flags = 0;
memset(r.buf, 0, MAX_PAYLOAD);
strcpy(NLMSG_DATA(&(r.nlh)), "hello, I am edsionte!"); //#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0))) //接下来对缓冲区向量iov进行初始化,让iov_base字段指向数据报结构,而iov_len为数据报长度。
struct iovec iov;
iov.iov_base = (void *)&r;
iov.iov_len = sizeof(r); //一切就绪后,将目的套接字地址与当前要发送的消息msg绑定,即将目的套接字地址复制给msg_name。再将要发送的数据iov与msg_iov绑定,假设一次///性要发送多个数据包,则创建一个iovec类型的数组。 struct msghdr msg;
msg.msg_name = (void *)&dest_addr;
msg.msg_namelen = sizeof(dest_addr);
msg.msg_iov = &iov;
msg.msg_iovlen = 1; //.向内核发送消息
if (sendmsg(sock_fd, &msg, 0) < 0) {
eprint(errno, "sendmsg", __LINE__);
return errno;
} //接收内核发来的消息
memset(&r.nlh, 0, NLMSG_SPACE(MAX_PAYLOAD));
if (recvmsg(sock_fd, &msg, 0) < 0) {
eprint(errno, "recvmsg", __LINE__);
return errno;
}
printf("Received message payload:%s\n", (char *)NLMSG_DATA(r.nlh));
close(sock_fd);
}
linux netlink套接字学习资料的更多相关文章
- linux netlink套接字实现相似ss命令 ,统计套接字以及TCP信息
參考了 ss的源码 以及 netlink相关资料:http://blog.csdn.net/scdxmoe/article/details/27711205 实现结果为: gcc netlink_di ...
- 【转载】Linux下套接字学习
感觉这个系列还不错,学习一下. 先看的是第三篇: http://blog.csdn.net/gatieme/article/details/46334337 < Linux下套接字详解(三)-- ...
- Linux/UNIX套接字连接
套接字连接 套接字是一种通信机子.凭借这样的机制.客户/server系统的开发工作既能够在本地单机上进行.也能够夸网络进行. 套接字的创建和使用与管道是有差别的.由于套接字明白地将客户和server区 ...
- Linux编程---套接字
网络相关的东西差点儿都是建立在套接字之上.所以这个内容对于程序猿来说还是蛮重要的啊. 事实上套接字也就是一个特殊的设备文件而已,我始终不能明确为什么要叫套接字.这么个奇怪的名字.只是还是就这样算了吧. ...
- Linux下套接字具体解释(三)----几种套接字I/O模型
參考: 网络编程–IO模型演示样例 几种server端IO模型的简介及实现 背景知识 堵塞和非堵塞 对于一个套接字的 I/O通信,它会涉及到两个系统对象.一个是调用这个IO的进程或者线程,还有一个就是 ...
- 关于linux 原始套接字编程
关于linux 网络编程最权威的书是<<unix网络编程>>,但是看这本书时有些内容你可能理解的不是很深刻,或者说只知其然而不知其所以然,那么如果你想搞懂的话那么我建议你可以看 ...
- linux 网络套接字
在内核分析网络分组时,底层协议的数据将传输到跟高的层.而发送数据的时候顺序是相反的.每一层都是通过加(首部+净荷)传向跟底层,直至最终发送. 这些操作决定了网络的的性能. 就如下图所示 linux因此 ...
- linux程序设计——套接字选项(第十五章)
如今能够改进客户程序,使它能够连接到不论什么有名字的主机,这次不是连接到演示样例server,而是连接到一个标准服务,这样就能够演示port号的提取操作了. 大多数UNIX和一些linux系统都有一项 ...
- Linux原始套接字实现分析---转
http://blog.chinaunix.net/uid-27074062-id-3388166.html 本文从IPV4协议栈原始套接字的分类入手,详细介绍了链路层和网络层原始套接字的特点及其内核 ...
随机推荐
- Hibernate一对多和多对一关系详解 (转载)
:双向一对多关系,一是关系维护端(owner side),多是关系被维护端(inverse side).在关系被维护端需要通过@JoinColumn建立外键列指向关系维护端的主键列. publ ...
- LinkedBlockingQueue
LinkedBlockingQueue是一个基于已链接节点的.范围任意的blocking queue的实现. 此队列按 FIFO(先进先出)排序元素.队列的头部 是在队列中时间最长的元素.队列的 ...
- 腾讯TDW:大型Hadoop集群应用[转载]
转自:http://www.uml.org.cn/sjjm/201508103.asp 作者:Uri Margalit 来源:InfoQ 发布于:2015-8-10 TDW(Tencent dist ...
- apache开源项目--OpenMeetings
OpenMeetings是一个多语言可定制的视频会议和协作系统.它支持音频.视频,能让你查看每个与会者的桌面.OpenMeetings还包含一个白板,通过白板可以导入各种格式的图片和涂鸦. 在线演示: ...
- jQuery基础知识— 获得内容和属性
jQuery拥有可操作HTML元素和属性的方法. 获得内容: text()--设置或返回所选元素的文本内容 html()--设置或返回所选元素的内容(包括HTML标记) val()--设置或返回表 ...
- Fragment中Button的android:onClick 无法监听相应
在Fragment的布局文件中,Button控件下添加android:onClick监听: 1.fragment_main.xml <RelativeLayout xmlns:android=& ...
- .Net课程体系
.Net课程体系
- Live555研究之二Sleep实现
Live555通过一个while循环来不断读取socket,判断是否有连接进来,但是Live555并没有使用Sleep函数来让线程休眠多少毫秒来降低CPU占用率.Live555是通过select函数来 ...
- selenium Grid
Selenium Grid 的机制是启动一个 hub,然后启动多个 Selenium RC 注册到 hub 上, 当测试请求到 hub 时,hub 会将测试分发给 Selenium RC, Selen ...
- theano学习指南5(翻译)- 降噪自动编码器
降噪自动编码器是经典的自动编码器的一种扩展,它最初被当作深度网络的一个模块使用 [Vincent08].这篇指南中,我们首先也简单的讨论一下自动编码器. 自动编码器 文献[Bengio09] 给出了自 ...