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));
usa 'multicast :: join_group (multicast_address, listen_endpoint.address(). To_v4())'. –
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
@Stefan publique su comentario como respuesta –