Python Socket跨网连接失败,如何实现不同网络设备间的Socket通信
问题根因
- 家用网络环境下,公网IP属于运营商分配给光猫/路由器的地址,不会直接分配到你的PC网卡上,因此直接在
bind参数中填写公网IP会触发报错。 - 内网设备默认处于NAT地址转换网络下,公网侧的设备无法主动向内网设备发起连接,这是跨网连接失败的核心原因。
解决方案
场景1:你拥有公网IP(可在路由器后台查看WAN口IP,若与公网查询到的IP一致即为有公网IP)
- 修改服务端绑定地址为
0.0.0.0,代表监听本地所有网卡的请求,对应代码修改为:
s.bind(('0.0.0.0', 12345))
- 登录路由器管理后台,找到端口映射/虚拟服务器配置页,添加映射规则:将外部端口12345映射到你PC的内网IP、内部端口12345,协议选择TCP。
- 放行路由器防火墙和PC本地防火墙12345端口的入站请求。
- 客户端
connect参数填写你的公网IP即可正常建立连接。
场景2:无公网IP(路由器WAN口IP为10/100/172.16-31开头的保留地址,属于运营商CGNAT场景)
- 服务端同样修改绑定地址为
0.0.0.0,启动服务端程序。 - 使用内网穿透工具将本地12345端口映射到公网,获取对应公网访问地址和端口。
- 客户端
connect参数填写穿透工具提供的公网地址、端口即可正常连接。
内容的提问来源于stack exchange,提问作者Arpanet_01
相关产品推荐
相关产品推荐

