2012-05-26 37 views
6

Parece ser un problema que muchas personas tienen, pero todas las respuestas que he encontrado hasta ahora no ayudaron.Escuchando una transmisión udp con la biblioteca de impulso

Problema: Estoy tratando de escuchar un Velodyne HDL32 que envía sus paquetes por UDP a mi pc. El sistema operativo es la biblioteca Ubuntu y Boost v1.46 de 32 bits.

Los datos que consigo a través de Wireshark es el siguiente:

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

Pero con este código, los datos no se muestra a mí (puerto es correcta):

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

¿Alguien puede identificar un problema hasta ahora o ¿necesita más información? Agradezco cualquier ayuda que pueda obtener.

NOTA: ¡NO estoy ejecutando el programa con privilegios de administrador!

Algunos pensamientos: ¿Podría ser posible que asio impulso :: :: :: ip address_v4 :: cualquier() no escuchar la IP .. *. 255 al tener subred 255.255.255.0?

Al usar netcat, no se muestran datos también. Cuando uso Windows netcat funciona bastante bien. Lo mismo con Wireshark en Linux y Windows, funciona bien. Lo intenté con el también, pero con el mismo efecto, sin datos.

+0

¿La aplicación le está enviando datos de multidifusión? Si es así, intente sin enlazar con el punto final de escucha. – Chad

+0

¿Ha llamado a io_service :: run()? Solo has mostrado un fragmento de tu código, así que tengo que preguntar. – Sean

+0

@Sean io_service.run() se llama en la función principal. El programa funciona bien cuando se reciben datos en una dirección IP específica y un puerto específico. Pero no se reciben datos cuando trato de escuchar la transmisión –

Respuesta

2

Gracias a todos por ayudarme. El código estaba bien, pero el problema estaba en el lado del velodyne y el networksetting con él.

Explicación de todos los otros que tratan de trabajar con un Velodyne:

El velodyne tiene su propia subred (192.168.17.x). Todos los datos grabados ahora se envían a la subred 192.168.3.x por difusión. En circunstancias normales, los datos deben recibirse en todas las direcciones IP de esta subred, pero parece que esto no es posible. La única IP que puede recibir datos es la IP 255 y eso solo si usa una de estas dos soluciones. (o utilizar ventanas o volcar un archivo con wireshark)

1. La estúpida pero trabajando solución

ajustar una puerta de entrada a 192.168.3.1. Sí, no hay ninguno, pero no importa. A partir de ahora se va a recibir datos en el IP 255.

2. La solución limpia

Establecer una nueva ruta que conduce todo el tráfico de la subred de la velodyne a la subred 192.168.3.x.

Realmente no sé por qué es tan complicado, pero nos llevó bastante tiempo descubrir este "secreto". Con suerte, algunos de ustedes se beneficiarán de nuestro trabajo meticuloso.

0

¿Ha intentado configurar la opción de transmisión?

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

thx BatchyX para la respuesta, pero cuando miré esta opción, dice: "Opción de socket para permitir el envío de mensajes de difusión." Pero necesito recibir datos para no enviarlos. –

+0

Para mí, el código fuente dice que habilita SO_BROADCAST, que es necesario en Linux para recibir datos de difusión. – BatchyX

Cuestiones relacionadas