2

次のようなリスナーがあります。

 receiver r(io_service,
               boost::asio::ip::address::from_string(argv[1]),
               boost::asio::ip::address::from_string(argv[2]));

パラメータを指定してコードを実行すると

./BoostAsioMCReceiver 0.0.0.0 239.255.0.1

リスナーは、(別のコンピューター上の) 送信者からすべてのマルチキャスト パケットを正常に取得します。ただし、実際にマシンのイーサネット IP アドレスを入力すると、たとえば

./BoostAsioMCReceiver 172.22.1.5 239.255.0.1

受信者はパケットを取得していないようです。これを行う必要があるのは、コンピューターに複数のイーサネット カードがあり、パケットが特定の NIC から、さらには正しいスイッチから送信されることを確認する必要があるためです。

レシーバーは次のようになります。

receiver(boost::asio::io_service& io_service,
         const boost::asio::ip::address& listen_address,
         const boost::asio::ip::address& multicast_address)
    : socket_(io_service)
{
    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);

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

private:
boost::asio::ip::udp::socket socket;
boost::asio::ip::udp::endpoint sender_endpoint;

なぜこれが起こっているのですか? また、推奨される修正方法は何ですか?

ありがとう。

4

2 に答える 2

5

私はしばらくの間、この問題に苦労しました。私はついにこの説明を見つけました。その投稿のこのコードにより、ソケットが正しいインターフェイスにバインドされました。

std::string address_listen = "1.2.3.4";
std::string address_mcast = "224.0.0.0";
unsigned short address_port = 50000;
boost::system::error_code ec;
boost::asio::ip::address listen_addr = boost::asio::ip::address::from_string(address_listen, ec);
boost::asio::ip::address mcast_addr = boost::asio::ip::address::from_string(address_mcast, ec);
boost::asio::ip::udp::endpoint listen_endpoint(mcast_addr, address_port);
socket.open(listen_endpoint.protocol(), ec); // boost::asio::ip::udp::socket
socket.set_option(boost::asio::ip::udp::socket::reuse_address(true), ec);
socket.bind(listen_endpoint, ec);
socket.set_option(boost::asio::ip::multicast::join_group(mcast_addr.to_v4(), listen_addr.to_v4()), ec);

このstackoverflowの投稿でも同じ解決策が説明されていると思います。

于 2014-11-23T22:37:30.353 に答える
2

boost.asio マルチキャストの例のリッスン アドレスは、実際にはローカル IP アドレスではありません。マルチキャスト グループ アドレスまたはワイルドカード アドレス「0.0.0.0」の可能性があります。

アドレス バインディングは、フィルタリングの目的で機能しています。たとえば、グループからのみパケットを受信するために、正確なマルチキャスト グループ アドレス () に設定できます。

あなたの場合、以下のようなコマンドを実行できます。

./BoostAsioMCReceiver 239.255.0.1 239.255.0.1

詳細については、こちらを参照してください [マルチキャスト (UDP) ソケットをバインドするとはどういう意味ですか? .

于 2016-07-02T04:21:41.660 に答える