双网卡接收组播的问题

mayudong1 2014-06-05 11:56:58
机器上有两个网卡,分别接到了不同的网络中(其实是一个接到了交换机上,另一个直接用网线连到了笔记本上)
然后用笔记本发送组播

ipmreq.imr_interface.S_un.S_addr = INADDR_ANY;
ipmreq.imr_multiaddr.S_un.S_addr = inet_addr("235.0.0.1");
nRet = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char *) &ipmreq, sizeof(ipmreq));

如果像上面一样imr_interface指定的是INADDR_ANY的话,程序收不到组播数据
改成 ipmreq.imr_interface.S_un.S_addr = inet_addr("192.168.10.11");后才能正常接收组播数据(192.168.10.11是跟笔记本直连的网口的ip地址)

有没有什么办法不指定具体的网卡,使用INADDR_ANY就能直接收到所有网口上的组播数据呢,因为有时候不确定组播数据时从哪个网口上过来的

...全文
1739 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mayudong1 2014-06-09
  • 打赏
  • 举报
回复
试了一下,能影响到广播和单播的接收的地方的就是在bind的时候设置的地址,如果设置成INADDR_ANY时广播和单播都能同时收到两个网络上的数据 但是影响到接收组播的除了bind时的地址外,还有ip_mreq结构体中imr_interface的设置,把这个设置成INADDR_ANY时就收不到某个网口上的组播数据了,设置成网口的地址就可以收到 我的应用是设置一个组播地址和端口号,然后接收音视频数据播放,设置的时候有个选择网卡的操作,除了列出了当前的网卡外还有一个”自动“的选项,选择”自动“时在代码上会将imr_interface设置成INADDR_ANY,这时候就会收不到数据
shenyi0106 2014-06-09
  • 打赏
  • 举报
回复
SO_BROADCAST
mayudong1 2014-06-06
  • 打赏
  • 举报
回复
一天了,都没一个人搭理我。。
mayudong1 2014-06-06
  • 打赏
  • 举报
回复
引用 4 楼 shenyi0106 的回复:
组播理论上和广播是一样的,所以我觉得你应该设置一下UDP的允许广播属性,试试看。 但是如果你的多块网卡在同一个网络中的话,那你还需要处理重复消息的机制。
udp的允许广播属性?那是什么东西呢 实际使用中两个网卡接在同一个网络中,没出现重复消息(也不是消息,就是通过组播接收音视频数据)
shenyi0106 2014-06-06
  • 打赏
  • 举报
回复
组播理论上和广播是一样的,所以我觉得你应该设置一下UDP的允许广播属性,试试看。 但是如果你的多块网卡在同一个网络中的话,那你还需要处理重复消息的机制。
mayudong1 2014-06-06
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
程序分别指定两个网卡的ip来监听
可有的应用场景会是两个网卡接在同一个网络中,都能收到数据 试过遍历网卡的方式,用每个网卡都尝试一下,能收到数据的就用,但总觉得不靠谱,而且后来还出现了遍历一次之后,在用INADDR_ANY的方式来接收的话,原来能收到的也变得收不到了,得关掉程序,等一段时间再开才能收到 之前试了下,单播的话在bind操作中的地址写成INADDR_ANY就没有问题,哪个网卡来的数据都能收到,但组播就不行了
oyljerry 2014-06-06
  • 打赏
  • 举报
回复
程序分别指定两个网卡的ip来监听

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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