2011-12-30 23 views
8

Probé el example, pero no funciona. Aparentemente, no establece la opción IPPROTO_IP/IP_MULTICAST_IF. Solo puedo encontrar boost :: asio :: ip :: multicast :: outbound_interface para IPPROTO_IP/IP_MULTICAST_IF, lo intenté pero fallé. ¿Hay alguna forma de hacer que boost :: asio :: ip :: multicast funcione sin llamar a c-level setsockopt?boost :: asio :: ip :: multicast :: join_group no funciona

boost::asio::ip::udp::endpoint listen_endpoint(
    listen_address, multicast_port); 
socket_.open(listen_endpoint.protocol()); 
socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true)); 
socket_.bind(listen_endpoint); 

// Join the multicast group. 
socket_.set_option(
    boost::asio::ip::multicast::join_group(multicast_address)); 
+2

usa 'multicast :: join_group (multicast_address, listen_endpoint.address(). To_v4())'. –

+1

Gracias por su recordatorio. Acabo de probar, y debemos configurar "0.0.0.0" para escuchar_endpoint. Entonces, la versión de trabajo es boost :: asio :: ip :: udp :: endpoint listen_endpoint (udp :: v4(), multicast_port); ... socket_.set_option (multicast :: join_group (address :: from_string (group _). To_v4(), address :: from_string (interface) .to_v4())); – poordeveloper

+0

@Stefan publique su comentario como respuesta –

Respuesta

4

respuesta correcta:

boost::asio::ip::udp::endpoint listen_endpoint(udp::v4(), multicast_port); 
... 
socket_.set_option(multicast::join_group(
    address::from_string(multicast_address).to_v4(), 
    address::from_string(interface).to_v4())); 
+5

¿Qué es la interfaz? – user997112

+0

interfaz es en realidad su dirección local para filtrar los paquetes entrantes. – iyasar

5

Creo que hay un error en boost example code for udp multicast.

En el código de ejemplo, vinculan el socket a la interfaz local, pero para la multidifusión udp, debe enlazar al puerto IP y al grupo de multidifusión udp.

socket_.bind(listen_endpoint); 

debería ser:

socket_.bind(
    boost::asio::ip::udp::endpoint(multicast_address, multicast_port)); 

ver multicast howto:

... para un proceso para recibir datagramas de multidifusión que tiene que pedir el núcleo a unirse al grupo y obligar a la puerto esos datagramas fueron enviados a. La capa UDP utiliza tanto la dirección de destino y el puerto de demultiplexar los paquetes y decidir qué socket (s) entregarlos a ...

... es necesario para asesorar al núcleo que los grupos de multidifusión estamos interesados ​​en . es decir, tenemos que pedir al kernel para "unirse" a esos grupos de multidifusión ...

cheque si se unió al grupo en la interfaz correcta con netstat -g | grep <multicast_group_ip>

esto es que creo ejemplo de código incorrecto impulso :

boost::asio::ip::udp::endpoint listen_endpoint(
    listen_address, multicast_port); 
socket_.open(listen_endpoint.protocol()); 
socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true)); 
socket_.bind(listen_endpoint); 

// Join the multicast group. 
socket_.set_option(
    boost::asio::ip::multicast::join_group(multicast_address)); 

socket_.async_receive_from(
    boost::asio::buffer(data_, max_length), sender_endpoint_, 
    boost::bind(&receiver::handle_receive_from, this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred)); 
Cuestiones relacionadas