linux netlink套接字学习资料

linux netlink套接字学习资料

大家好,又见面了,我是全栈君。

理论:

http://blog.csdn.net/unbutun/article/details/3394061

进一步深入:

Netlink编程-用户主动发起会话

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);}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115455.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • checkbox选中和不选中 jqu_jquery checkbox 选中不选中「建议收藏」

    checkbox选中和不选中 jqu_jquery checkbox 选中不选中「建议收藏」展开全部$(function(){//动态绑定默认状态//$(“#ck”).attr(“checked”,true)//选中//$(“#ck”).attr(“checked”,false)//未选中//点击判断选中还是未选中$(“#ck”).click(function(){if($(this).is(“:checked”)){alert(“选中”);}else{alert…

  • pycharm编制索引_网页制作作品源代码

    pycharm编制索引_网页制作作品源代码tree/f/a>codeTree.txt

  • pycharm安装插件报错怎么办_pycharm安装哪些插件

    pycharm安装插件报错怎么办_pycharm安装哪些插件Pycharm安装插件Pycharm安装插件Pycharm中一些值得安装的插件RainbowBracketsIdeaVimMarkdownNavigatorTranslation如果说编辑器是程序员的武器,那么插件就是装备加成。插件可以让编写代码更加灵活Pycharm安装插件点击file–settings,进入设置找到apperance中的Plugins,在搜索框中搜索想要的插件,然后点击安装即可Pycharm中一些值得安装的插件RainbowBrack

  • JS后退一页

    JS后退一页Javascript返回上一页:1.history.go(-1),返回两个页面:history.go(-2);2.history.back().3.window.history.forward()返回下一页4.window.history.go(返回第几页,也可以使用访问过的URL)例:向上一页response.Write(“”) response.W

  • 数据库查询优化的一般步骤_sql创建数据库失败

    数据库查询优化的一般步骤_sql创建数据库失败长按识别下方二维码,即可"关注"公众号每天早晨,干货准时奉上!0、序言本文我们来谈谈项目中常用的20条MySQL优化方法,效率至少提高3倍!具体如下:1、使⽤…

  • Hybrid APP混合开发的一些经验和总结

    Hybrid APP混合开发的一些经验和总结HybridAPP混合开发的一些经验和总结转载至: http://www.cnblogs.com/yuanyingke/p/6060150.html1、混合开发概述Hybrid App主要以JS+Native两者相互调用为主,从开发层面实现“一次开发,多处运行”的机制,成为真正适合跨平台的开发。Hybrid App兼具了Native App良好用户体验的优势,

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号