使用 Boost ASIO 多播到 macOS 上的特定接口

Posted

技术标签:

【中文标题】使用 Boost ASIO 多播到 macOS 上的特定接口【英文标题】:Multicast to specific interface on macOS using Boost ASIO 【发布时间】:2017-01-27 17:57:26 【问题描述】:

我有一段代码在 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】:

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

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

【讨论】:

以上是关于使用 Boost ASIO 多播到 macOS 上的特定接口的主要内容,如果未能解决你的问题,请参考以下文章

使用 ZEROMQ 和 NORM 将数据包多播到大量 WiFi 设备

创建使用 Boost ASIO 且不公开它的静态库

C++ Boost ASIO:在类中初始化 io_context:

Asio 或 Boost.Asio 能否在 iPhone 或 Android 上运行?

绑定多播 (UDP) 套接字是啥意思?

在 Windows 上使用 Boost.Asio 的半并发 ICMP ping