我有一个为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中运行)?
1 回答
经过大量无结果的搜索和一些实验后,我认为我找到了一个解决方案,其中涉及将问题中代码的最后一行更改为:
基本上,似乎在OSX上你必须告诉套接字使用哪个接口,但前提是它没有通过DHCP得到它的IP地址 . 这似乎也可以在Windows上运行(尽管之前也是如此) .
如果比我聪明的人可以解释为什么这样做有效以及为什么你必须在OSX上这样做,那么我会给他们答案的功劳 .