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 回答