手动选择TCP上的一个接口来发送数据

手动选择TCP上的一个接口来发送数据

问题描述:

我有一个TCP服务器只在特定的接口上侦听。如果传入的连接来自xxx.xxx.xxx.0子网,那么我想要在accept()之后调用数据,然后数据应该通过intf1,否则应该通过intf2发送数据,这是我的服务器正在侦听的地方。手动选择TCP上的一个接口来发送数据

这两个接口都具有相同的路由设置和优先级。所有的网络都可以从这两个接口访问。

一种方法是通过intf1添加一个具有更高优先级的新路由,但我希望这是一个基于代码的决定。

该代码是在纯C写在Linux上。

+0

可能有很好的方法来解决你认为会解决的任何问题。但这可能不是正确的做法。 – 2011-08-18 23:10:03

不幸的是,您的选择是有限的,因为TCP/IP堆栈在内核中实现,您的接口是路由表。你最好的选择是手动分配一条路线。

你也可以使用netlink库来实时添加/删除路由,但是有些部分的TCP数据包会在错误的接口上传输,直到调用完成。当您的数据包与原始接口的地址通过另一个接口发射时,您可能会遇到路由问题。

尽管它不完全是您正在寻找的纯粹的C选项,也许您可​​以在收到accept()后使用iptables规则。

(虽然快速看一下/ lib中/ iptables的表明你可能是运气)

我想象将所有TCP流量重定向到您指定的设备的规则。您甚至可以使规则知道套接字状态,以便在accept()之后不需要提名接口。


这一切都适用,直到我发现计划中的明显缺陷,拍我的头,说“哦!”

您可以在程序中更改路线rtnetlink。 您可以修改所需的所有参数。另见netdevice