免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2088 | 回复: 1
打印 上一主题 下一主题

[通信方式] netlink通信,内核收不到用户态消息 [复制链接]

论坛徽章:
1
子鼠
日期:2014-05-05 10:36:02
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-12 12:54 |只看该作者 |倒序浏览
今天在调内核态和用户态的通信,参考的是http://www.ibm.com/developerworks/cn/linux/l-netlink/ 里的代码,使用netlink通信。
我用的是linux 3.10.xx版本,和上面文章用的版本可能相差了很多,很多接口函数都不一样,修改一番后,大致如下:
内核先nlfd = netlink_kernel_create(&init_net, NL_SENDINFO, &_cfg);
在kernel_receive里接收用户态数据。
用户态:
skfd = socket(PF_NETLINK, SOCK_RAW, NL_SENDINFO);//创建socket
bind(skfd, (struct sockaddr*)&local, sizeof(local))//绑定地址
sendto(skfd, &message, message.hdr.nlmsg_len, 0,(struct sockaddr*)&kpeer, sizeof(kpeer));//向内核发送数据(自己的pid)

但是编译运行的结果是:
运行用户态程序后,内核的确进入了对应的kernel_receive函数,
但是,在while((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL)这里直接跳出。
不清楚为什么既然进了接收函数,但是取数据时候为空?
请问大婶们这可能是哪里出问题了呢?

论坛徽章:
1
子鼠
日期:2014-05-05 10:36:02
2 [报告]
发表于 2014-05-12 14:15 |只看该作者
不好意思,是因为没有把内核的接收函数改回来。。
内核2.6.32之前是static void kernel_receive(struct sock *sk, int len)
之后的版本就是static void kernel_receive(struct sk_buff *skb)了。。。
感觉netlink的接口变得好快。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP