我有一个为Windows和OSX编写的应用程序,它使用Boost ASIO进行网络连接。此应用程序的一部分向嵌入式设备发送多播消息以响应:
std::string ip_addr = "224.0.0.177";
boost::asio::ip::udp::endpoint senderEndpoint(boost::asio::ip::address::from_string(ip_addr), 7076);
m_pcDiscoverySocket->send_to(boost::asio::buffer((void*)pGetDeviceInfoMessage->m_pchData, pGetDeviceInfoMessage->m_ulDataSize), senderEndpoint);
此代码在Windows上运行得非常好。它也可以在OSX上正常工作,但只有在网络上有DHCP服务器时才能正常工作。当网络上没有DHCP服务器并且所有内容都有自动ip分配的地址169.254.x.x时,send_to函数会抛出异常,并显示错误消息“send_to:Network is unreachable”。如果我将上面代码中的IP地址更改为169.254.0.1,那么它运行时没有错误消息,但嵌入式设备显然没有响应,因为它不是广播IP地址。
我有点困惑。任何人都可以解释为什么它会抛出这个错误,或者为什么相同的代码在Windows中运行(在具有相同硬件的Mac上的VM中运行)?
答案 0 :(得分:0)
所以经过大量无结果的搜索和一些实验后,我认为我找到了一个解决方案,其中涉及将问题中代码的最后一行更改为:
Input
基本上,似乎在OSX上你必须告诉套接字使用哪个接口,但前提是它没有通过DHCP得到它的IP地址。这似乎也可以在Windows上运行(尽管之前也是如此)。
如果比我更聪明的人可以解释为什么这样做有效,以及为什么你必须在OSX上这样做,那么我会给予他们答案的功劳。