2017-01-27 5 views
0

Ich habe ein Stück Code, der eine Multicast-Nachricht auf jedem Ethernet-Netzwerk-Schnittstelle auf einem Mac sendet (weil die Geräte, die reagieren könnten auf Wifi oder eine kabelgebundene Ethernet-Verbindung sein). Dieser Code wurde gut funktioniert für eine ganze Weile:Multicast zur spezifischen Schnittstelle auf MacOS mit Boost ASIO

for(int i = 0; i < strIPAddresses.size(); i++) 
{ 
    boost::asio::ip::address addr; 
    addr.from_string(strIPAddresses[i]); 
    m_pcDiscoverySocket->set_option(boost::asio::ip::multicast::outbound_interface(addr.to_v4())); 
    m_pcDiscoverySocket->send_to(boost::asio::buffer((void*)pGetDeviceInfoMessage->m_pchData, pGetDeviceInfoMessage->m_ulDataSize), senderEndpoint); 
} 

Wo strIPAddresses ein String-Array der IP-Adressen jeder Netzwerkschnittstelle.

In Mac OS 10.12 hat sich jedoch etwas in der Art und Weise geändert, wie dieser Code implementiert wird und es scheint die Funktion zu ignorieren, die die ausgehende Schnittstelle festlegt und für sich selbst die beste Schnittstelle zum Senden der Nachricht zu bestimmen. Ich kann dies mit Wireshark auf einer anderen Maschine sehen - es sieht Doppel jeder Nachricht über WLAN, wenn die zweite Nachricht über die Kabelschnittstelle gesendet werden soll.

Kennt jemand eine Möglichkeit, MacOS zu zwingen, eine Multicast-Nachricht auf einer bestimmten Schnittstelle zu senden, vorzugsweise mit Boost ASIO?

Antwort

0

Das Binden eines Sockets an eine Schnittstelle passiert normalerweise nur einmal in einer Socketlebensdauer. Ich könnte mir vorstellen, dass der Fall, dass ein Socket an eine andere Schnittstelle gebunden wird, einfach nicht funktioniert, da er entweder in Boost oder sogar im Betriebssystem nicht getestet wurde.

Was passiert, wenn Sie nur die kabelgebundene Schnittstelle versuchen, ohne zuerst an die WiFi-Schnittstelle zu binden? Wenn das funktioniert, haben Sie einen Fehler gefunden und Sie kennen die Problemumgehung.