gpt4 book ai didi

c++ - Boost::Asio 多播监听地址

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:05 31 4
gpt4 key购买 nike

我有一个这样的听众:

 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;

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

谢谢。

最佳答案

我在这个问题上挣扎了一段时间。我终于找到了this explanation .该帖子中的这段代码导致我的套接字绑定(bind)到正确的接口(interface):

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

我相信this post在 stackoverflow 上也描述了相同的解决方案。

关于c++ - Boost::Asio 多播监听地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18491877/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com