Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
手动选择TCP上的接口以发送数据_C_Linux_Networking_Tcp - Fatal编程技术网

手动选择TCP上的接口以发送数据

手动选择TCP上的接口以发送数据,c,linux,networking,tcp,C,Linux,Networking,Tcp,我有一个TCP服务器,它只监听特定的接口。我希望在调用accept()后,如果传入连接来自xxx.xxx.xxx.0子网,则数据应通过intf1发送,否则数据应通过intf2发送,intf2是我的服务器正在侦听的位置 两个接口具有相同的路由设置和优先级。所有网络都可以从两个接口访问 一种解决方法是添加一条通过intf1的具有更高优先级的新路由,但我希望这是一个基于代码的决策 代码是在Linux上用纯C编写的。不幸的是,您的选项有限,因为TCP/IP堆栈是在内核中实现的,而您的接口是路由表。最好是

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

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

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


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

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


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

虽然这不是您要寻找的纯C选项,但您可以在收到accept()时使用规则

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

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



所有这些都适用,直到我发现方案中的明显缺陷,拍拍我的头说“哦!”

你可以在你的程序中改变路线,让它改变。
可以修改所需的所有参数。另请参见。

可能有一种很好的方法可以解决您认为这会解决的任何问题。但这可能不是正确的方法。