首页 文章

在OSX上增加ASIO多播故障

提问于
浏览
0

我有一个为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 回答

  • 0

    经过大量无结果的搜索和一些实验后,我认为我找到了一个解决方案,其中涉及将问题中代码的最后一行更改为:

    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上这样做,那么我会给他们答案的功劳 .

相关问题