如何强制套接字连接在Linux下使用特定的networking适配器? IP路由问题?

我有多个networking适配器,并且需要能够指定我的套接字用于出站连接的适配器,以便我可以有一个或多个套接字绑定到每个networking。 我已经看了这个问题的其他答案,但似乎无法使其工作。

将套接字绑定到我想要连接的适配器的IP address不起作用。 SO_BINDTODEVICE似乎也不工作,试图通过适配器名称或适配器索引,调用成功,但套接字无法连接。 我无法find使用SO_BINDTODEVICE来澄清正确用法的完整示例。

使用上述方法的症状是服务器接收到连接,但connect()在客户端上失败,错误代码为2(?)。 我读了ip路由是需要的,以确保答复数据包发送通过相同的适配器,他们收到,但似乎无法得到正确的ip route命令。

 The tables Teth0 and Twlan0 have been added. For eth0, the IP address is 192.168.1.23, the gateway is 192.168.1.1 For wlan0, the IP address is 192.168.2.100, the gateway is 192.168.2.1 ip route add 192.168.1.1/32 dev eth0 src 192.168.1.23 table Teth0 ip route add default via 192.168.1.1 table Teth0 ip rule add from 192.168.1.23 table Teth0 ip route add 192.168.2.1/32 dev wlan0 src 192.168.2.100 table Twlan0 ip route add default via 192.168.2.1 table Twlan0 ip rule add from 192.168.2.100 table Twlan0 

ip路由刷新caching

我在GumStix Overo(Omap3)上m using Open Embedded Linux 2.6.36。

任何提示将不胜感激,因为我在这里坚果;)

你正在试图定义两条到外界的默认路由。 你应该只有一个默认的网关/路由。

赔率是这是怎么回事:

  • 您使用无线适配器作为您指示的出站连接/源IP地址
  • 内核检查是否有从wlan0到目的地的路由
  • 由于无线设备具有默认网关/路由,因此存在可行的路由,并且3way握手从wlan0开始
  • 在一些stream量(显然是2mb到你的传输)之后,内核查看连接,并确定尽pipe这个stream量已经跨越了无线networking,路由表中的第一个(也是唯一相关的)默认网关/路由是通过eth0
  • 内核开始通过eth0发送
  • 远端开始从eth0接收stream量,使用错误的源IP地址,或不知道如何通过eth0networking返回wlan0 IP的数据并忽略它
  • 有一些中等质量的工具可以为你处理这个问题,但是这不适用于静态的IP地址,绝对不是一个坏的路由表。