2016-03-23 10 views
0

私は、WindowsとOSXの両方のために書かれたアプリケーションで、ネットワーキングにBoost ASIOを使用しています。このアプリケーションの一部は、組み込みデバイス向けのマルチキャストメッセージを送信して、次のように応答します。OSXでの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サーバーがなく、すべてにauto-ipに169.254.x.xのアドレスが割り当てられている場合、send_to関数は "send_to:Network is unreachable"というエラーメッセージで例外をスローします。上記のコードのIPアドレスを169.254.0.1に変更すると、エラーメッセージは表示されませんが、組み込みデバイスはブロードキャストIPアドレスではないため、明らかに応答しません。

私はちょっと困惑しています。誰もがなぜこのエラーを投げているのか、同じコードがWindowsで動作しているのか(同一のハードウェアでMac上のVMで動作しているのか)説明できますか?

答えて

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でこれを行う必要があるのか​​を説明できる場合は、回答のクレジットを与えます。

+0

OSX(およびLinux)のデフォルトルートは、インターフェイスのステータスに基づいて設定されます。 DHCPの場合、通常はデフォルトのインターフェイスがDHCPなしで正しく設定されています。デフォルトインターフェイスは設定されていないか、マルチキャストトラフィックをルーティングするように設定されていない可能性があります。複数のアダプタを使用すると状況はさらに悪化します。 – Chad

関連する問題