我有一个只监听特定接口的TCP服务器。我希望在accept()
调用之后,如果传入连接来自xxx.xxx.xxx.0
子网,那么数据应该通过intf1,否则数据应该通过我的服务器正在侦听的intf2发送。
两个接口具有相同的路由设置和优先级。所有网络都可以从这两个接口访问。
一种解决方法是添加一个优先级更高的通过intf1的新路由,但我希望这是一个基于代码的决策。
代码是在Linux上用纯C编写的。
发布于 2008-09-23 03:29:37
虽然它不完全是您正在寻找的纯C选项,但是您也许可以在收到accept()时使用iptables规则。
(尽管快速浏览/lib/iptables会发现您可能很幸运)
我正在想象一个规则,它会将所有tcp流量重定向到您指定的设备。您甚至可以让规则知道套接字状态,这样就不需要在accept()之后指定接口。
所有这些都是适用的,直到我发现了这个计划中的明显缺陷,拍了拍我的头,说:“哦!”
发布于 2008-09-23 00:52:33
不幸的是,您的选择是有限的,因为TCP/IP堆栈是在内核中实现的,而您的接口是路由表。最好的办法是手动分配路由。
您还可以使用netlink库动态添加/删除路由,但TCP数据包的一部分将通过“错误”接口,直到调用完成。当带有原始接口地址的数据包通过另一个接口发送时,您可能会遇到路由问题。
https://stackoverflow.com/questions/119745
复制