c++ - 将套接字重新绑定(bind)到不同的接口(interface)

标签 c++ c linux sockets

是否有关于如何将套接字从一个物理接口(interface)重新绑定(bind)到另一个物理接口(interface)的现有 Linux/POSIX C/C++ 库或示例代码?

例如,我在与物理连接 A 关联的套接字上进行 ping 传输,我想将该套接字重新绑定(bind)到物理连接 B,并让 ping 数据包继续在连接 B 上发送和接收(经过短暂的延迟在切换期间)。

我只需要这个用于无 session 协议(protocol)。

谢谢

更新:

我正在尝试提供用于 PPP 和以太网设备的故障转移解决方案。

我有一个基本脚本,它可以通过使用 iptables、NAT 和路由表来完成 90% 的功能。

问题是发生故障转移时,ping 继续在辅助连接上发送,但是,它们的源 IP 来自旧连接。

我已经与一些在商业路由器上工作的人交谈过,他们的建议是将套接字重新绑定(bind)到辅助接口(interface)。

更新 2:

很抱歉没有提前说明这一点。该解决方案将在路由器上运行。我无法更改 ping 程序,因为它将在客户端计算机上运行。我以 ping 为例,任何不是基于 session 的连接都应该能够被切换。我在几个商业路由器上测试了这个功能,它确实有效。不幸的是,他们的软件是专有的,但是,从各种对话和测试中,我发现他们在故障转移时重新绑定(bind)套接字。

最佳答案

在您更新的帖子中,问题是更改路由信息不会更改您的 ping 的源地址,它只会迫使它退出第二个接口(interface)。 This answer包含一些相关信息。

您需要更改 ping 程序。您可以使用每个接口(interface)一个套接字的方法,并以某种方式通知程序何时进行故障转移。或者您将不得不关闭套接字,然后绑定(bind)到第二个接口(interface)。

您可以通过多种方式获取所需的接口(interface)信息,包括使用 SIOCGIFCONF 选项调用 ioctl() 并循环遍历返回的结构以获取接口(interface)地址信息。

关于c++ - 将套接字重新绑定(bind)到不同的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/826354/

相关文章:

c++ - 没有指针的继承

c++ - 在 OpenMP 线程中充分私有(private)化数据

c++ - 初始化继承的成员数据

c - fork() - 如何让最后一个子进程杀死父进程/原始进程?

c - 跳过指纹读取器 PAM 模块以从 C 应用程序使用 PAM 进行身份验证

linux - 如何在 Linux 上的汇编中找到程序进程 ID 号以自动终止程序?

c++ - 有没有办法在指向类类型的指针中不使用 * 来调用类运算符?

c++ - 我如何以标准方式从 C++ 中的 argc 和 argv 中获益?

c - 如何在linux中的c中获取pid的所有后代子进程id

c - 从不兼容的 void * 分配 int*