2012-05-26 5 views
6

Sembra essere un problema che molte persone hanno, ma tutte le risposte che ho trovato finora non hanno aiutato.Ascoltare una trasmissione udp con la libreria boost

Problema: Sto cercando di ascoltare un HDL32 Velodyne che invia i suoi pacchetti via UDP al mio pc. Il sistema operativo è Ubuntu a 32 bit e libreria Boost v1.46.

I dati che ottengo tramite Wireshark è simile al seguente:

Time  | Source   | Destination | Protocol | Length | Source Port | Destination Port 
0.000000 | 192.168.17.212 | 192.168.3.255 | UDP  | 1248 | https  | opentable 

Ma con questo codice, nessun dato viene mostrato a me (Port è corretto):

receiver(boost::asio::io_service& io_service, 
    const boost::asio::ip::address& listen_address) 
: m_socket(io_service) 
{ 

boost::asio::ip::address ipAddr = boost::asio::ip::address_v4::any(); 
boost::asio::ip::udp::endpoint listen_endpoint(
     ipAddr, 2368); 

m_socket.open(listen_endpoint.protocol()); 
m_socket.bind(listen_endpoint); 

m_socket.async_receive_from(
    boost::asio::buffer(m_data, max_length), m_sender_endpoint, 
    boost::bind(&receiver::handle_receive_from, this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred)); 
} 

void handle_receive_from(const boost::system::error_code& error, 
    size_t bytes_recvd) 
{ 
std::cout << "receive" << bytes_recvd << std::endl; 


    m_socket.async_receive_from(
     boost::asio::buffer(m_data, max_length), m_sender_endpoint, 
     boost::bind(&receiver::handle_receive_from, this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred)); 
} 

Qualcuno può identificare un problema finora o hai bisogno di maggiori informazioni? Apprezzo qualsiasi aiuto che posso ottenere.

NOTA: NON sto eseguendo il programma con i privilegi di root!

Alcuni pensieri: Potrebbe essere possibile che boost :: asio :: ip :: :: address_v4 qualsiasi() non ascoltare l'IP .. *. 255 quando si ha subnetmask 255.255.255.0?

Quando si utilizza netcat, non viene mostrato alcun dato. Quando uso Windows netcat funziona abbastanza bene. Lo stesso con Wireshark su Linux e Windows - funziona perfettamente. Provato anche con il, ma con lo stesso effetto - nessun dato.

+0

L'applicazione sta inviando dati multicast? In tal caso, provare senza legarsi all'endpoint di ascolto. – Chad

+0

Hai chiamato io_service :: run()? Hai solo mostrato un frammento del tuo codice, quindi devo chiederlo. – Sean

+0

@Sean io_service.run() viene chiamato nella funzione principale. Il programma funziona correttamente quando si ricevono dati su un IP specifico e una porta specifica. Ma nessun dato viene ricevuto quando provo ad ascoltare la trasmissione –

risposta

2

Grazie a tutti per aver provato ad aiutarmi. Il codice andava bene, ma il problema era dalla parte del velodyne e del networking con esso.

Spiegazione per tutti gli altri che cercano di lavorare con un Velodyne:

Il velodyne ha il proprio sottorete (192.168.17.x). Tutti i dati registrati vengono ora inviati alla sottorete 192.168.3.x per trasmissione. In circostanze normali i dati dovrebbero essere ricevuti su tutti gli IP in questa sottorete, ma ciò non sembra possibile. L'unico IP che puoi ricevere è l'IP 255 e solo se usi una di queste due soluzioni. (o utilizzare finestre o scaricare un file con Wireshark)

1. Il stupido, ma la soluzione di

Impostare un gateway a 192.168.3.1. Sì, non ce n'è, ma non importa. Da oggi uno riceverete i dati sul IP 255.

2. La soluzione pulita

Impostare un nuovo percorso che porta tutto il traffico dalla sottorete del Velodyne al 192.168.3.x. sottorete

Non so davvero perché è così complicato, ma ci è voluto un po 'di tempo per scoprire questo "segreto". Spero che alcuni di voi trarranno profitto dal nostro pignolo lavoro.

0

Hai provato a impostare l'opzione di trasmissione?

// do this before binding 
boost::asio::socket_base::broadcast option(true); 
m_socket.set_option(option); 
+0

thx BatchyX per la risposta, ma quando ho visto questa opzione in alto dice: "Opzione socket per consentire l'invio di messaggi broadcast." Ma devo ricevere i dati per non inviarli. –

+0

Per me, il codice sorgente dice che abilita SO_BROADCAST, che è necessario su linux per ricevere i dati di trasmissione. – BatchyX