OS0

2016-03-23 35 views
0

'da ASIO çok noktaya yayın hatası Yükseltme Ağ için Boost ASIO kullanan hem Windows hem de OSX için yazılmış bir uygulamam var. Bu kod Windows üzerinde kesinlikle iyi çalışırOS0

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); 

: Gömülü cihazlar yanıt vermek için bu uygulama bir bölümü noktaya yayın mesajı gönderir. Ayrıca OSX'te de iyi çalışır, ancak sadece ağda bir DHCP sunucusu olduğunda. Ağda hiçbir DHCP sunucusu olmadığında ve her şey otomatik olarak ip adresi 169.254.x.x olduğunda, send_to işlevi "send_to: Ağ erişilemiyor" hata mesajıyla bir istisna atar. Yukarıdaki koddaki IP adresini 169.254.0.1 olarak değiştirirseniz, hata mesajları olmadan çalışır, ancak gömülü aygıtlar yayın IP adresi olmadığı için yanıt vermez.

Biraz şaşkınım. Herkes bu hatayı neden attığını veya aynı kodun Windows'da neden çalıştığını açıklayabilir (aynı donanımda Mac'te bir VM'de çalışır)?

cevap

0

Bu yüzden söz konusu kodun son satırı değiştirerek içeren bir çözüm buldum sonuçsuz arama bir sürü ve birkaç deneyler sonrasında: Temelde

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; 
    } 
} 

bunun açık görünüyor OSX'e hangi arabirimi kullanacağınızı söylemelisiniz, ancak sadece IP adresini DHCP ile almamışsa. Bu da Windows üzerinde çalışıyor gibi görünüyor (yine de yaptı).

Benden daha akıllı biri, bunun neden çalıştığını ve neden OSX'de bunu yapmanız gerektiğini açıklayabilirse, onlara cevabın kredisini vereceğim.

+0

OSX (ve Linux) üzerindeki varsayılan yol, arabirim durumuna göre ayarlanır. DHCP için, genellikle varsayılan arabirim DHCP olmadan düzgün şekilde ayarlanır; varsayılan arabirim, çok noktaya yayın trafiğinizi yönlendirecek şekilde ayarlanmamış veya ayarlanmamıştır. Birden çok adaptörle işler daha da kötüleşir. – Chad