gpt4 book ai didi

python - 如果有另一个接口(interface)处于事件状态,绑定(bind)的套接字将不会连接

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:25 26 4
gpt4 key购买 nike

我的电脑有两个互联网连接:一个普通的 Wifi 连接和一个 GSM 调制解调器 - 接口(interface)和 IP 是:

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

在过去的几个小时里,我一直在尝试编写一个简单的程序,从给定的接口(interface)连接到某个 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'

问题是,当两个接口(interface)都处于事件状态(已连接)时,该程序将无法运行 - 即。 create_connection 行将超时。

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

我有 Ubuntu 14.04、python 2.7

附言。将 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)没有答案:/

最佳答案

好的,我自己的“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

关于python - 如果有另一个接口(interface)处于事件状态,绑定(bind)的套接字将不会连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28216362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com