有人用过netlink socket中的NETLINK_GENERIC吗?

b0207191 2010-12-13 11:53:46
想实现一个应用程序a向其他应用程序b、c、d、e....广播消息
使用netlink中的NETLINK_GENERIC

我在程序a中,绑定源地址addr.nl_groups = 0,目的地址addr.nl_groups =1

b程序绑定源地址为addr.nl_groups = 1,可以收到a发来的消息

但是接下来发现一个奇怪的现象

b程序只要绑定addr.nl_groups为奇数, 就可以收到a发来的消息,为偶数,就收不到a发来的消息

这是为什么呢? 我的预期是只要b绑定源地址addr.nl_groups != 1,就不该收到a发来的消息啊?
...全文
389 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenyi14500 2013-08-19
  • 打赏
  • 举报
回复
Hi b0207191 你好, 我现在也正要写一个类似你那样的程序,但是我仿网上的实例先个简单的netlink socket,但是sendto failed. #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <asm/types.h> #include <linux/netlink.h> #include <sys/socket.h> int main(void) { int sock; int ret; struct sockaddr_nl snl; struct nlmsghdr nh; char recv_buf[1024]; int len; //create socket sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC); if(sock < 1) { printf("create socket faild.\n"); return -1; } //bind memset(&snl, 0, sizeof(snl)); snl.nl_family = AF_NETLINK; snl.nl_groups = 1; snl.nl_pid = getpid(); ret = bind(sock, (struct sockaddr *)&snl, sizeof(snl)); if(ret < 0) { printf("bind socket failed."); return -1; } //fill nh memset(&nh, 0, sizeof(nh)); nh.nlmsg_len = NLMSG_LENGTH(sizeof(nh)); nh.nlmsg_type = NLMSG_NOOP; nh.nlmsg_flags = NLM_F_CREATE | NLM_F_DUMP; //send ret = sendto(sock, &nh, nh.nlmsg_len, 0, (struct sockaddr *)&snl, sizeof(snl)); if(ret < 0) { printf("send faild.(errono: %d)\n", ret); return -1; } //receive memset(recv_buf, 0, sizeof(recv_buf)); len = recv(sock, recv_buf, sizeof(recv_buf), 0); if(len > 0) { printf("%s\n", recv_buf); }; return 0; } 能帮忙看看吗?
充电宝111 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 b0207191 的回复:]

to cdbdyx: 是这样的,程序a里面 源group我填写的是0, 目的group填写的是1, 这样只要程序b注册源group是1,或者3 5, 0x0001这个位都是能命中的,所以出现了我首帖的情况。呵呵。
[/Quote]

我的意思是,你现在实现的是这种情况,a ---> kernel ---> b,c,d,那么kernel里面不需要驱动去转发这个netlink消息么?
充电宝111 2010-12-13
  • 打赏
  • 举报
回复
netlink不是用户进程跟内核通信的手段么?你怎么用在了用户进程之间?
b0207191 2010-12-13
  • 打赏
  • 举报
回复
to cdbdyx: 是这样的,程序a里面 源group我填写的是0, 目的group填写的是1, 这样只要程序b注册源group是1,或者3 5, 0x0001这个位都是能命中的,所以出现了我首帖的情况。呵呵。
充电宝111 2010-12-13
  • 打赏
  • 举报
回复
不是1就是0
nladdr->nl_pid = nlk->pid;
nladdr->nl_groups = nlk->groups ? nlk->groups[0] : 0;

另,你在kernel空间实现了一个驱动负责接收用户进程的消息,然后广播出去?
b0207191 2010-12-13
  • 打赏
  • 举报
回复
知道原因了,netlink的group是按位计算的,目的为1就标识,所有源组为奇数的都能收到。

“如果消息是发往一个或者多个多播组的话,应该用所有目的多播组的比特位与运算形成nl_groups的值”
b0207191 2010-12-13
  • 打赏
  • 举报
回复
因为有个用户进程间广播消息的需求,如果用domain socket,需要自行实现一个广播逻辑,所以看见netlink就想用了。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧