Boost :: Asio Multicast监听地址

时间:2013-08-28 15:15:23

标签: c++ boost boost-asio

我有一个这样的听众:

 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看起来像这样:

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;

为什么会发生这种情况,建议的解决方案是什么?

感谢。

2 个答案:

答案 0 :(得分:2)

我一直在努力解决这个问题。我终于找到了this explanation。该帖子的代码导致我的socket绑定到正确的接口:

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上的this post也描述了相同的解决方案。

答案 1 :(得分:0)

boost.asio组播示例的侦听地址实际上不是本地IP地址。它可以是多播组地址或通配符地址“0.0.0.0”。

地址绑定用作过滤目的。例如您可以将其设置为确切的多播组地址(),以便仅接收来自该组的数据包。

对于您的情况,您可以运行如下命令,

./BoostAsioMCReceiver 239.255.0.1 239.255.0.1

请在此处查看更多说明[What does it mean to bind a multicast (UDP) socket?