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.
L'applicazione sta inviando dati multicast? In tal caso, provare senza legarsi all'endpoint di ascolto. – Chad
Hai chiamato io_service :: run()? Hai solo mostrato un frammento del tuo codice, quindi devo chiederlo. – Sean
@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 –