2011-12-30 21 views
8

Próbowałem example, ale to nie działa. Najwyraźniej nie ustawia opcji IPPROTO_IP/IP_MULTICAST_IF. Mogę tylko znaleźć boost :: asio :: ip :: multicast :: outbound_interface dla IPPROTO_IP/IP_MULTICAST_IF, próbowałem, ale nie udało mi się. Czy istnieje sposób na zwiększenie :: asio :: ip :: multicast bez wywoływania c-level setsockopt?boost :: asio :: ip :: multicast :: join_group nie działa

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

użyj 'multicast :: join_group (multicast_address, listen_endpoint.address(). To_v4())'. –

+1

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

+0

@Stefan dodaj komentarz jako odpowiedź –

Odpowiedz

4

Prawidłowa odpowiedź:

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

Co to jest interfejs? Interfejs – user997112

+0

jest w rzeczywistości twoim lokalnym adresem do filtrowania przychodzących pakietów. – iyasar

5

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)); 
Powiązane problemy