0

我有一个仅在特定接口上侦听的 TCP 服务器。我希望在accept()调用之后,如果传入连接来自xxx.xxx.xxx.0子网,那么数据应该通过 intf1 否则数据应该通过我的服务器正在侦听的 intf2 发送。

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

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

代码是在 Linux 上用纯 C 语言编写的。

4

3 回答 3

1

虽然它不完全是您正在寻找的纯 C 选项,但也许您可以在收到 accept() 时使用iptables规则。

(尽管快速浏览 /lib/iptables 表明您可能很幸运)

我正在想象一个规则,它将所有 tcp 流量重定向到您指定的设备。你甚至可以让规则知道套接字状态,这样你就不需要在 accept() 之后指定接口。


所有这些都适用,直到我发现计划中的明显缺陷,拍拍我的头说“D'oh!”

于 2008-09-23T11:29:36.783 回答
0

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

您还可以使用 netlink 库即时添加/删除路由,但 TCP 数据包的某些部分将通过“错误”接口,直到进行调用。当具有原始接口地址的数据包通过另一个接口发出时,您可能会遇到路由问题。

于 2008-09-23T08:52:32.577 回答
0

您可以使用rtnetlink更改程序中的路由。您可以修改所需的所有参数。另请参阅网络设备

于 2008-09-23T11:46:36.103 回答