将套接字重新绑定到不同的接口

时间:2009-05-05 18:47:47

标签: c++ c linux sockets

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

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

我只需要这个用于无会话协议。

谢谢

更新

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

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

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

我和一些从事商用路由器工作的人谈过,他们的建议是将套接字重新绑定到辅助接口。

更新2:

我为之前没有详细说明而道歉。此解决方案将在路由器上运行。我无法更改ping程序,因为它将在客户端计算机上运行。我使用ping作为示例,任何非基于会话的连接都应该能够被切换。我在几个商用路由器上测试了这个功能,它确实有效。不幸的是,他们的软件是专有的,但是,通过各种对话和测试,我发现他们在故障转移时重新绑定了套接字。

3 个答案:

答案 0 :(得分:3)

从您更新的帖子开始,问题是更改路由信息不会改变ping的源地址,只会强制它出第二个接口。 This answer包含一些相关信息。

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

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

答案 1 :(得分:0)

我不认为这是一个非常明确的操作。物理接口具有不同的MAC地址,因此除非您有路由层映射它们(NAT等),否则它们将具有不同的IP地址。

端口由<IP addr, Port number, protocol>的三倍标识,因此如果您的IP地址发生更改,端口将会发生变化。

你真的想在这做什么?

答案 2 :(得分:0)

我完全不确定你要完成什么,但我有一个猜测......你想尝试做某种故障转移吗?如果是这样,那么确实有办法实现这一点,但为什么不在操作系统而不是应用程序中进行呢?

一方面,您可以使用CARP,另一方面,您可以在故障转移模式下使用接口中继/绑定(术语各不相同)。