手动选择TCP上的接口以发送数据
我有一个TCP服务器,它只监听特定的接口。我希望在调用手动选择TCP上的接口以发送数据,c,linux,networking,tcp,C,Linux,Networking,Tcp,我有一个TCP服务器,它只监听特定的接口。我希望在调用accept()后,如果传入连接来自xxx.xxx.xxx.0子网,则数据应通过intf1发送,否则数据应通过intf2发送,intf2是我的服务器正在侦听的位置 两个接口具有相同的路由设置和优先级。所有网络都可以从两个接口访问 一种解决方法是添加一条通过intf1的具有更高优先级的新路由,但我希望这是一个基于代码的决策 代码是在Linux上用纯C编写的。不幸的是,您的选项有限,因为TCP/IP堆栈是在内核中实现的,而您的接口是路由表。最好是
accept()
后,如果传入连接来自xxx.xxx.xxx.0
子网,则数据应通过intf1发送,否则数据应通过intf2发送,intf2是我的服务器正在侦听的位置
两个接口具有相同的路由设置和优先级。所有网络都可以从两个接口访问
一种解决方法是添加一条通过intf1的具有更高优先级的新路由,但我希望这是一个基于代码的决策
代码是在Linux上用纯C编写的。不幸的是,您的选项有限,因为TCP/IP堆栈是在内核中实现的,而您的接口是路由表。最好是手动分配路线。
您也可以使用netlink库动态添加/删除路由,但TCP数据包的某些部分将通过“错误”接口,直到调用完成。当带有原始接口地址的数据包通过另一个接口发出时,您可能会遇到路由问题。虽然这不是您要寻找的纯C选项,但您可以在收到accept()时使用规则 (尽管快速查看/lib/iptables表明您可能很幸运) 我正在设想一个规则,将所有tcp流量重定向到您指定的设备。甚至可以让规则知道套接字状态,这样就不需要在accept()之后指定接口
所有这些都适用,直到我发现方案中的明显缺陷,拍拍我的头说“哦!”你可以在你的程序中改变路线,让它改变。
可以修改所需的所有参数。另请参见。可能有一种很好的方法可以解决您认为这会解决的任何问题。但这可能不是正确的方法。