我在具有多个网络接口的主机之间使用多播UDP.我正在使用boost :: asio,并且被接收器必须进行的2个操作混淆:bind,然后是join-group.
当您对加入的每个组播组执行此操作时,为什么需要在绑定期间指定接口的本地地址?
姐妹问题是关于多播端口:因为在发送期间,您发送到多播地址和端口,为什么在订阅多播组期间,您只需指定地址,而不是端口 - 在混乱的呼叫中指定的端口绑定.
注意:"join-group"是一个包装器setsockopt(IP_ADD_MEMBERSHIP),如文档所示,可以在同一个套接字上多次调用以订阅不同的组(通过不同的网络?).因此,每次订阅组时,抛弃绑定调用并指定端口是完全合理的.
从我所看到的,总是绑定到"0.0.0.0"并在加入组时指定接口地址,效果非常好.困惑.
我试过这个 例子,但它不起作用.显然它没有设置IPPROTO_IP/IP_MULTICAST_IF选项.我只能为IPPROTO_IP/IP_MULTICAST_IF找到boost :: asio :: ip :: multicast :: outbound_interface,我试过但失败了.有没有办法让boost :: asio :: ip :: multicast工作而不需要调用c-level setsockopt?
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);
// Join the multicast group.
socket_.set_option(
boost::asio::ip::multicast::join_group(multicast_address));
Run Code Online (Sandbox Code Playgroud)