我有一个这样的听众:
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;
为什么会发生这种情况,建议的解决方案是什么?
感谢。
答案 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?。