myślę, że jest błąd w boost example code for udp multicast.
W przykładowym kodzie wiążą one gniazdo z lokalnym interfejsem, ale w przypadku multiemisji udp należy powiązać adres IP i port grupy multicast.
socket_.bind(listen_endpoint);
powinno być:
socket_.bind(
boost::asio::ip::udp::endpoint(multicast_address, multicast_port));
zobaczyć multicast howto:
... dla procesu otrzymać multicast datagramów to musi zwrócić się do jądra dołączyć do grupy i wiązało port te datagramy zostały wysłane do. Warstwa UDP wykorzystuje zarówno adres docelowy i port demultipleksowania pakietów i zdecydować, które gniazd (a) dostarczyć je do ...
... konieczne jest poinformowanie grupy multicast jądro, które jesteśmy zainteresowany . oznacza to, że musimy zwrócić się do jądra do „join” te grup multicast ...
check jeśli dołączył do grupy prawidłowego interfejsu z netstat -g | grep <multicast_group_ip>
jest to wierzę nieprawidłowy impuls przykład kodu :
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));
użyj 'multicast :: join_group (multicast_address, listen_endpoint.address(). To_v4())'. –
Dzięki za przypomnienie. Po prostu próbowałem i musimy ustawić "0.0.0.0" na listen_endpoint. Tak więc działająca wersja to boost :: asio :: ip :: udp :: endpoint listen_endpoint (udp :: v4(), multicast_port); ... socket_.set_option (multicast :: join_group (adres :: from_string (grupa _). To_v4(), adres :: from_string (interfejs) .to_v4())); – poordeveloper
@Stefan dodaj komentarz jako odpowiedź –