我的电脑有两个连接到互联网的连接:常规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)没有答案:/
答案 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