Ich habe eine Anwendung für Windows und OSX geschrieben, die Boost ASIO für das Networking verwendet. Ein Teil dieser Anwendung sendet eine Multicast-Nachricht für eingebettete Geräte, um darauf zu reagieren:Boost ASIO Multicast Fehler unter OSX
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);
Dieser Code funktioniert unter Windows absolut einwandfrei. Es funktioniert auch unter OSX, aber nur, wenn ein DHCP-Server im Netzwerk vorhanden ist. Wenn kein DHCP-Server im Netzwerk vorhanden ist und alle Adressen mit automatischer IP-Adresse 169.254.x.x zugewiesen sind, löst die Funktion send_to eine Ausnahme mit der Fehlermeldung "send_to: Network is unreachable" aus. Wenn ich die IP-Adresse in dem obigen Code zu 169.254.0.1 ändere, wird es ohne Fehlermeldungen ausgeführt, aber die eingebetteten Geräte reagieren offensichtlich nicht, da es keine Broadcast-IP-Adresse ist.
Ich bin ein bisschen verblüfft. Kann jemand erklären, warum es diesen Fehler gibt, oder warum der gleiche Code in Windows funktioniert (läuft in einer VM auf dem Mac mit identischer Hardware)?
Die Standardroute unter OSX (und Linux) wird basierend auf dem Schnittstellenstatus eingerichtet. Bei DHCP ist normalerweise die Standardschnittstelle richtig eingestellt, ohne DHCP ist die Standardschnittstelle wahrscheinlich nicht festgelegt oder nicht auf die Weiterleitung des Multicastverkehrs eingestellt. Mit mehreren Adaptern wird es noch schlimmer. – Chad