使用Boost ASIO在macOS上组播到特定接口

时间:2017-01-27 17:57:27

标签: c++ macos boost multicast asio

我有一段代码在Mac上的每个以太网网络接口上发送多播消息(因为响应的设备可能是wifi或有线以太网连接)。这段代码已经工作了很长时间了:

for(int i = 0; i < strIPAddresses.size(); i++)
{
   boost::asio::ip::address addr;
   addr.from_string(strIPAddresses[i]);
   m_pcDiscoverySocket->set_option(boost::asio::ip::multicast::outbound_interface(addr.to_v4()));
   m_pcDiscoverySocket->send_to(boost::asio::buffer((void*)pGetDeviceInfoMessage->m_pchData, pGetDeviceInfoMessage->m_ulDataSize), senderEndpoint);
}

其中strIPAddresses是每个网络接口的IP地址的字符串数组。

然而,在macOS 10.12中,实现此代码的方式发生了一些变化,似乎忽略了设置出站接口的功能,并自行决定发送消息的最佳接口。我可以在另一台机器上使用Wireshark看到这一点 - 当第二条消息应该通过有线接口发送时,它会通过wifi看到每条消息的两倍。

有没有人知道强制macOS在给定接口上发送多播消息的方法,最好使用Boost ASIO?

1 个答案:

答案 0 :(得分:0)

将套接字绑定到接口通常仅在套接字生存期中一次。我可以想象套接字重新绑定到不同接口的情况就是无效,因为它未经测试,无论是在Boost中,还是在操作系统中。

如果您只是尝试有线接口而没有先绑定到WiFi接口会发生什么?如果这样做,你发现了一个错误,你知道解决方法。