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