asio指定网卡加入组播组

背景:

rtsp客户端接收组播流,PC上存在多个网卡情况下,加入组播组时会选择默认的网卡加入,导致无法接收组播消息,即使抓包已经抓到组播的数据也接收不到。

上图中的IGMPv3消息如果不是由接收组播流的网卡发送将无法接收组播数据,此时需要在调用加入组播的接口中指定网卡。

asio坑:我用的asio1.16.1,bind时,在windows上设置endPoint的ip为组播组ip会崩溃,要设置any()才行,且能正常区分不同组播组ip相同组播端口的流,但linux上如果设置any会导致同一个组播端口不同组播ip的流都能收到,需要设置endPoint的ip为组播组ip才行。按理asio做跨平台不应该这样windows和linux同一套代码有差异。

实现:

asio创建rtsp信令的socket后,可根据信令的socket获取和媒体服务器连接的网卡的ip,代码如下:

rtspSocket.local_endpoint().address().to_string(); // 获取连接到媒体服务器的网卡ip

加入组播组:

auto bindIp = asio::ip::address_v4::from_string(multicastIP);
#ifdine WIN32 // windows下绑定组播组ip会崩溃,linux不绑定组播组ip相同端口的组播会串流
    bindIp = asio::ip::address_v4::any();
#endif

asio::ip::udp::endpoint endPoint(bindIp, multicastPort);
multicastSock.open(endPoint.protocol());
multicastSock.set_option(asio::ip::udp::socket::reuse_address(true));
multicastSock.bind(endPoint);
multicastSock.set_option(asio::ip::muticast::join_group(asio::ip::address_v4::from_string(multicastIP),
asio::ip::address_v4::from_string(networkIP))); 
// 重点在这里,第二个参数可以不填,系统将随机选择网卡加入组播组,需要指定上一步获取的网卡ip
multicastSock.receive_from(...)

 重点在设置join_group的第二个构成产生为对应网卡的IP,这个参数可以不填,系统将随机选择网卡加入组播组,这里需要指定上一步获取的网卡IP.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值