Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Sockets 如何让不同的进程使用不同的网络接口?_Sockets_Networking_Network Programming - Fatal编程技术网

Sockets 如何让不同的进程使用不同的网络接口?

Sockets 如何让不同的进程使用不同的网络接口?,sockets,networking,network-programming,Sockets,Networking,Network Programming,我是客户。有多个网络接口。如何让不同的进程使用不同的网络接口进行通信?因为我想连接到同一台服务器,所以这里的路由似乎不起作用。另外,connect()没有像bind()那样指定本地地址或接口的参数。如果您的目标是通过并行使用多个网络接口来增加服务器的带宽,那么这可能不是您在应用程序级别可以(或应该)做的事情。相反,您应该研究一下,然后配置您的计算机和网络堆栈来使用它。一旦工作正常,您将自动获得所需的并行化加速,而无需客户机应用程序执行任何特殊操作来启用它 “bind()系统调用经常被误解。它用于

我是客户。有多个网络接口。如何让不同的进程使用不同的网络接口进行通信?因为我想连接到同一台服务器,所以这里的路由似乎不起作用。另外,
connect()
没有像
bind()
那样指定本地地址或接口的参数。

如果您的目标是通过并行使用多个网络接口来增加服务器的带宽,那么这可能不是您在应用程序级别可以(或应该)做的事情。相反,您应该研究一下,然后配置您的计算机和网络堆栈来使用它。一旦工作正常,您将自动获得所需的并行化加速,而无需客户机应用程序执行任何特殊操作来启用它

“bind()系统调用经常被误解。它用于 绑定到一个特定的IP地址。只绑定到该IP地址的数据包 地址将被接收,任何传输的数据包都将携带该地址 作为源的IP地址。bind()不控制有关 传输数据包的路由。例如,如果您绑定到IP eth0的地址,但您将数据包发送到 内核的最佳路由是eth1,它将愉快地发送数据包 源IP地址为eth0的eth1。这对于 TCP/IP,其中数据包可以在到达目的地的途中穿越不相关的网络 目的地。”

更多信息,例如

这就是您可能误解bind()调用的原因


绑定到物理拓扑(到某些特定接口)的适当方法是使用
SO\u BINDTODEVICE
socket选项。这是通过调用
setsockopt()
完成的

源策略路由
可能会有所帮助

请尝试以下步骤:

  • 使用
    iptables
    为来自不同进程的数据包提供不同的标记
  • 使用
    iproute2
    将具有不同标记的数据包路由到不同的表
  • 在不同的表中,将默认路由设置为不同的上行链路
整个过程需要对linux网络有一定的了解

以下示例显示了如何通过一个特定上行链路为用户路由所有流量:

您可以尝试遵循类似的方法,使用不同的用户运行不同的进程,并将流量从一个用户路由到一个上行链路


您还可以让进程与具有不同端口的服务器进行通信,并按端口标记通信量。

为什么您认为需要它们对同一服务器使用不同的接口?是什么让你认为“路由在这里不起作用”?既然bind()已经指定了本地地址,为什么connect()应该允许您指定本地地址?问题是什么?我想通过多个网络接口与同一台服务器通信,以利用客户端上的所有带宽。