我在客户端。有多个网络接口。如何让不同的进程使用不同的网络接口进行通信?由于我想连接到同一台服务器,因此路由似乎不起作用。此外,connect()
没有用于指定bind()
的本地地址或接口的参数。
答案 0 :(得分:6)
如果您的目标是通过并行使用多个网络接口来增加服务器的带宽,那么这可能不是您可以(或应该)在应用程序级别执行的操作。相反,您应该研究Link Aggregation,然后配置您的计算机和网络堆栈以使用它。一旦工作正常,您将自动获得所需的并行化加速,而客户端应用程序不必执行任何特殊操作即可启用它。
答案 1 :(得分:4)
“bind()系统调用经常被误解。它习惯了 绑定到特定的IP地址。只有发往该IP的数据包 将收到地址,并且任何传输的数据包都将携带该地址 IP地址作为其来源。 bind()不控制任何关于 传输数据包的路由。例如,如果你绑定到IP eth0的地址,但是您将数据包发送到目的地 内核的最佳路由是eth1,它会很乐意将数据包发送出去 eth1,源IP地址为eth0。这完全有效 TCP / IP,数据包可以在前往的途中遍历不相关的网络 目的地。“
更多信息,例如here
这就是为什么你可能会误解bind()调用。
绑定到物理拓扑(到某个特定接口)的适当方法是使用SO_BINDTODEVICE
套接字选项。这是通过setsockopt()
调用完成的。
答案 2 :(得分:2)
Source Policy Routing
可能会有所帮助。
请尝试以下步骤:
iptables
为来自不同进程的数据包提供不同的标记。iproute2
将具有不同标记的数据包路由到不同的表。整个过程需要对linux网络有一定的了解。
以下示例说明如何通过一个特定的上行链路为用户路由所有流量:http://www.niftiestsoftware.com/2011/08/28/making-all-network-traffic-for-a-linux-user-use-a-specific-network-interface/
您可以尝试通过使用不同的用户运行不同的流程并将流量从一个用户路由到一个上行链路来遵循类似的方法。
此外,您可以让进程与具有不同端口的服务器通信,并按端口标记流量。