2011-12-30 8 views
8

私はexampleを試しましたが、動作しません。 IPPROTO_IP/IP_MULTICAST_IFオプションは設定されていません。私はIPPROTO_IP/IP_MULTICAST_IFのboost :: asio :: ip :: multicast :: outbound_interfaceしか見つけられませんでしたが、試しましたが失敗しました。 boost :: asio :: ip :: multicastをCレベルのsetsockoptを呼び出さずに動作させる方法はありますか?boost :: asio :: ip :: multicast :: join_groupが動作しません

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

は 'マルチキャスト:: join_group(マルチキャストアドレス、listen_endpoint.address()。to_v4())'を使用します。 –

+1

ご報告いただきありがとうございます。ちょうど試しましたが、 "0.0.0.0"をlisten_endpointに設定する必要があります。だから作業バージョンは boost :: asio :: ip :: udp :: endpoint listen_endpoint(udp :: v4()、multicast_port)です。 ... socket_.set_option(マルチキャスト:: join_group(アドレス:: from_string(グループ_)。to_v4()、 アドレス:: from_string(インターフェイス).to_v4())); – poordeveloper

+0

@Stefanあなたのコメントを回答として投稿してください –

答えて

4

正解:

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

インターフェイスとは何ですか? – user997112

+0

インターフェイスは実際に着信パケットをフィルタリングするローカルアドレスです。 – iyasar

5

私はboost example code for udp multicastに誤りがあると思います。

例のコードでは、これらはソケットをローカルインターフェイスにバインドしますが、udpマルチキャストの場合はudpマルチキャストグループのIPとポートにバインドする必要があります。

socket_.bind(listen_endpoint); 

は次のようになります。それはグループに参加してバインドするために、カーネル を依頼しているマルチキャストデータグラムを受信するためのプロセスのために...

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

multicast howtoを見ますこれらのデータグラムをポート に送信しました。 UDP層は、我々が興味 あるマルチキャストグループカーネルに助言する必要がある... ...パケットを分離しているソケット(S)に配信を決定 に

を宛先アドレスとポートの両方を使用していますあなたはnetstat -g | grep <multicast_group_ip>

で正しいインターフェイス上のグループに参加している場合。つまり、私たちは...それら マルチキャストグループに「参加」するためにカーネルを依頼する

チェックを持っている、これは私が間違っブーストサンプルコードを信じています:

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)); 
関連する問題