Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OSX上的Boost ASIO多播失败_C++_Macos_Boost_Boost Asio_Multicast - Fatal编程技术网

C++ OSX上的Boost ASIO多播失败

C++ OSX上的Boost ASIO多播失败,c++,macos,boost,boost-asio,multicast,C++,Macos,Boost,Boost Asio,Multicast,我有一个为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:

我有一个为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:网络无法访问”。如果我将上述代码中的IP地址更改为169.254.0.1,那么它运行时没有错误消息,但嵌入式设备显然没有响应,因为它不是广播IP地址


我有点困惑。有人能解释为什么它会抛出这个错误,或者为什么相同的代码在Windows中工作(在Mac上的VM中使用相同的硬件运行)?

因此,经过大量徒劳的搜索和一些实验,我认为我找到了一个解决方案,其中包括将问题中的最后一行代码更改为:

boost::asio::ip::tcp::resolver resolver(m_IOservice);
boost::asio::ip::tcp::resolver::query query(boost::asio::ip::host_name(),"");
boost::asio::ip::tcp::resolver::iterator it = resolver.resolve(query);
boost::asio::ip::address interface_ip_address;

while(it!=boost::asio::ip::tcp::resolver::iterator())
{
    interface_ip_address = (it++)->endpoint().address();
    if(interface_ip_address.is_v4())
    {
        m_pcDiscoverySocket->set_option(boost::asio::ip::multicast::outbound_interface(interface_ip_address.to_v4()));
        m_pcDiscoverySocket->send_to(boost::asio::buffer((void*)pGetDeviceInfoMessage->m_pchData, pGetDeviceInfoMessage->m_ulDataSize), senderEndpoint);
        break;
    }
}
基本上,在OSX上,似乎必须告诉套接字使用哪个接口,但前提是它没有通过DHCP获得IP地址。这似乎也适用于Windows(尽管它以前也适用)

如果有比我更聪明的人能解释为什么这样做,为什么你必须在OSX上这样做,那么我会给他们一个答案。

OSX(和Linux)上的默认路由是根据接口状态设置的。对于DHCP,通常正确设置默认接口,如果没有DHCP,默认接口可能未设置或未设置为路由多播流量。使用多个适配器,情况会变得更糟。