c++ - 将套接字绑定(bind)到具有未知 Ip 的特定接口(interface)

标签 c++ sockets centos boost-asio network-interface

我有一个有两个接口(interface)的主机。在我的特定情况下,我正在尝试使用 boost::asio::ip::multicast::join_group 加入多播组,这似乎只有在我使用包含本地地址的构造函数时才有效。但是我事先不知道连接到将进行多播的远程主机的本地接口(interface)的IP地址。但是我知道它将是 eth1。当然,我可以让它可配置,但这似乎引入了一个无用的错误配置机会,看看如何为接口(interface)和我的应用程序配置相同的地址。

理想情况下,应该有一种非常明显的方法来从接口(interface)而不是地址创建 boost::asio::endpointboost::asio::address我不知何故错过了。或者,我当然会很高兴使用任何其他方法来推断接口(interface) Ip,无论有没有 DHCP 服务器提供 Ip。

有没有合适的方法来做,或者我应该相信用户永远不会弄乱配置?

为了确保这不完全是 XY 问题,这是我在测试加入多播组时使用的代码:

m_socket.open(boost_ip::udp::v4());
m_socket.bind(boost_ip::udp::endpoint(boost_ip::udp::v4(), listeningPort));

m_socket.set_option(boost::asio::ip::udp::socket::reuse_address(true));
m_socket.set_option(boost::asio::ip::multicast::join_group(
                  boost::asio::ip::address::from_string("225.x.x.10").to_v4(),  // remote
                  boost::asio::ip::address::from_string("192.x.x.3").to_v4())); // local

这确实有效,但是当我放弃最后一行以不依赖于当前本地地址(可能在部署中更改)时,我不再收到任何数据包。

最佳答案

多播使用IGMP协议(protocol)组成多播组。由于 IGMP 在网络层运行,因此它需要加入多播组的端点的本地 IP 地址。

应用程序应该等待指示 IP 地址已分配给以太网接口(interface)的事件,然后调用 join_group 方法加入多播组。

关于c++ - 将套接字绑定(bind)到具有未知 Ip 的特定接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28946270/

相关文章:

c++ - 我如何递归搜索项目的列表列表,获得 "closest"匹配项

c++ - 程序的调用堆栈限制在所有计算机上是否一致?

c++ - 从 QObject 继承类中的 winsock 连接函数

ruby - 我如何绝对确保 Phusion Passenger 实例保持事件状态?

c++ - 创建独立 exe (Forms) (C++) 的最佳方式

c++ - 线程安全队列C++

当客户端发送字符串时,Java websocket服务器接收到的不是纯文本

java - 使用多个服务或在单个服务中执行所有操作哪个更好?

centos - 百胜安装包,但我找不到它

ssh - mysql centOS 6 下载软件包时出错 :