2011-12-30 13 views
8

Ho provato il example, ma non funziona. Apparentemente non imposta l'opzione IPPROTO_IP/IP_MULTICAST_IF. Posso trovare solo boost :: asio :: ip :: multicast :: outbound_interface per IPPROTO_IP/IP_MULTICAST_IF, ho provato ma non ci sono riuscito. C'è un modo per rendere boost :: asio :: ip :: multicast senza chiamare c-level setsockopt?boost :: asio :: ip :: multicast :: join_group non funziona

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

usare 'multicast :: join_group (indirizzo_ multicast, listen_endpoint.address(). A_v4())'. –

+1

Grazie per il tuo promemoria. Appena provato, e dobbiamo impostare "0.0.0.0" su listen_endpoint. Quindi la versione operativa è boost :: asio :: ip :: udp :: endpoint listen_endpoint (udp :: v4(), multicast_port); ... socket_.set_option (multicast :: join_group (indirizzo :: from_string (gruppo _). A_v4(), indirizzo: from_string (interfaccia) .to_v4())); – poordeveloper

+0

@Stefan pubblica il tuo commento come risposta –

risposta

4

Risposta corretta:

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

Che cos'è l'interfaccia? L'interfaccia – user997112

+0

è in realtà il tuo indirizzo locale per filtrare i pacchetti in entrata. – iyasar

5

Penso che ci sia un errore nella boost example code for udp multicast.

Nel codice di esempio collegano il socket all'interfaccia locale ma per il multicast di udp è necessario eseguire il binding all'IP e alla porta del gruppo multicast di udp.

socket_.bind(listen_endpoint); 

dovrebbe essere:

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

vedere multicast howto:

... per un processo di ricevere datagrammi multicast che ha da chiedere al kernel di unirsi al gruppo e legare il porta quei datagrammi venivano inviati a a. Lo strato UDP utilizza sia l'indirizzo di destinazione e la porta a demultiplexare i pacchetti e decidere quale presa (s) consegnarli a ...

... è necessario avvisare il kernel che i gruppi multicast siamo interessati a . Cioè, dobbiamo chiedere al kernel di "join" quei gruppi multicast ...

controllo se ti sei iscritto al gruppo su interfaccia corretta con netstat -g | grep <multicast_group_ip>

questo è credo esempio di codice errato spinta :

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