#define NETLINK_TEST 25 message[slen]= '\0'; } int stringlength(char *s) for(; *s; s++){ return slen; void nl_data_ready(struct sk_buff *__skb) memcpy(str, NLMSG_DATA(nlh), sizeof(str)); } // Initialize netlink nl_sk = netlink_kernel_create(&init_net, NETLINK_TEST, 1, if(!nl_sk){ printk("my_net_link_3: create netlink socket ok.\n"); return 0; static void netlink_exit(void) printk("my_net_link: self module exited\n"); module_init(netlink_init); MODULE_AUTHOR("frankzfz"); |
下面是用户空间的程序:
#define NETLINK_TEST 25 // To prepare binding retval = bind(sock_fd, (struct sockaddr*)&src_addr, sizeof(src_addr)); // To prepare recvmsg memset(&dest_addr,0,sizeof(dest_addr)); nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD); printf("state_smg\n"); if(state_smg == -1) memset(nlh,0,NLMSG_SPACE(MAX_PAYLOAD)); close(sock_fd); return 0; |
下面是Makefile文件:
|
其中,netlink_k.c为内核的空间的程序。
先运行内核代码netlink_k.ko,也就是在执行完makefile文件后,会生成一个netlink_k.ko文件,可以使用下面的命令进行安装,insmod netlink_k.ko,使用lsmod查看,当安装成功后,然后,执行./netlink用户空间程序,可以在另一个终端下执行dmesg命令,查看内核通信的情况。这里netlink程序向内核空间发送一个hello you!内核返回给一个I am from kernel!在这里使用了一个定时器,也就是每3秒中发送一次I am from kernel!只有内核把10个字符串全部发送完毕后,用户空间的sendmsg()才会返回,也就是在用户空间的netlink才会输出内核空间发送过来的数据,这里只有一个简单的程序,并没有什么实际的意义,因为,正如前面所说的一般情况下不会在回调函数中处理太多的东西,以免sendmsg()函数返回不及时。下面是使用dmesg命令输出的信息。
|
今天的文章netlink实例分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/12510.html