如果另一个接口处于活动状态,则绑定套接字将不会连

时间:2015-01-29 13:48:54

标签: python linux sockets

我的电脑有两个连接到互联网的连接:常规Wifi连接和GSM调制解调器 - 接口和接口。 IP是:

wlan0: 192.168.1.100 (Wifi)
ppp0: 10.192.157.244 (GSM)

在过去的几个小时里,我一直在尝试编写一个简单的程序,它可以从给定的接口连接到某些IP。特别是我喜欢我的程序来连接GSM IP(ppp0)。因此,根据这里的文档,这是一个非常简单的脚本,应该允许我这样做:

import socket
host = 'example.com'
port = 80
bindtoip = '10.192.157.244'
(soc_family, _, _, _, address) = socket.getaddrinfo(host, port)[0]
s = socket.create_connection(address, source_address=(bindtoip, 0))
print 'connected'

问题在于,当两个接口都处于活动状态(已连接)时,此程序无法正常工作 - 即。 create_connection行将超时。

当我从Wifi断开连接并再次运行时,它可以工作。 有人可以解释一下吗?

我有Ubuntu 14.04,python 2.7

PS。将create_connection更改为socket + bind + connect不会改变任何内容

PS2。刚刚发现wget有同样的问题:

wget --bind-address=10.192.157.244 -q -O - http://example.com

所以它似乎是更多与Linux相关的问题,而不是与Python相关的问题。 另一方面,我有一个具有多个IP的(Linux)专用服务器,它可以从它的所有IP连接而没有任何问题(来自wget和python脚本)。为什么呢?

PS3。看起来与此类似:Java Socket Bind Local Interface (ppp0)没有答案:/

1 个答案:

答案 0 :(得分:0)

好吧,我自己的“post scriptum 2”让我走上正轨。这确实是一个系统问题(路由也是n.m.指出)。这是一个包含解决方案详细说明的页面:

https://kindlund.wordpress.com/2007/11/19/configuring-multiple-default-routes-in-linux/

因此,在我的问题中使用IP需要:

  • 创建一个新的“ppp”路由表:

    echo "1 ppp" >> /etc/iproute2/rt_tables
    
  • 添加路由规则:

    ip route add 10.0.0.0/8 dev ppp0 src 10.192.157.244 table ppp
    ip route add default via 10.64.64.64 dev ppp0 table ppp
    ip rule add from 10.192.157.244/32 table ppp
    ip rule add to 10.192.157.244/32 table ppp