You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python套接字绑定失败:AWS EC2上OSError Errno99问题求助

解决AWS EC2上Python Socket服务端绑定失败&连接超时问题

核心问题原因

EC2实例的公网IP是AWS通过NAT技术映射的,实例本身网卡并不持有公网IP,直接绑定公网IP必然报错Cannot assign requested address;而绑定内网IP/127.0.0.1会导致远程客户端无法访问,出现连接超时。

分步解决方案

1. 修正服务端绑定地址

服务端必须绑定0.0.0.0,这个地址表示监听实例所有可用网卡(包括内网网卡)的请求,AWS的NAT会自动把公网IP的流量转发到实例的内网IP上。

修改后的服务端初始化代码示例:

import socket
import threading

class Server:
    def __init__(self, ip_addr, port):
        self.my_port = port             
        self.my_ip_addr = ip_addr       

        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        
        # 关键修改:绑定0.0.0.0而非公网IP
        self.server.bind((self.my_ip_addr, self.my_port))
        self.server.listen()
        
        # 后续接受连接的代码示例
        print(f"服务端已启动,监听 {self.my_ip_addr}:{self.my_port}")
        client_socket, client_addr = self.server.accept()
        print(f"已连接客户端 {client_addr}")
        # 收发消息逻辑...

启动服务端时,输入0.0.0.0作为绑定IP,端口保持55555即可。

2. 配置EC2安全组(必做)

EC2的安全组是第一道防火墙,必须开放对应端口的入站流量:

  • 进入EC2控制台,找到目标实例的安全组
  • 添加入站规则:
    • 类型:自定义TCP
    • 端口范围:55555
    • 源:如果客户端是另一台EC2,填该EC2的公网IP/内网IP;测试阶段可以填0.0.0.0/0(允许所有IP访问,生产环境请限制IP范围)

3. 客户端连接正确姿势

客户端连接时,必须使用服务端EC2的公网IP和端口55555,示例代码:

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 替换为服务端EC2的公网IP
client.connect(("12.345.678.90", 55555))

# 收发消息逻辑
client.send("Hello from client".encode())
response = client.recv(1024).decode()
print(f"收到服务端消息: {response}")

4. 验证服务端监听状态

在服务端EC2上执行命令,确认服务端是否正常监听:

ss -tulpn | grep 55555

如果输出包含0.0.0.0:55555,说明监听成功。

常见坑点排查

  • 不要尝试绑定EC2的公网IP:实例内部没有这个IP,绑定必然失败
  • 不要只依赖关闭实例防火墙:EC2安全组的优先级更高,必须配置入站规则
  • 客户端不要连接服务端的内网IP:内网IP仅在VPC内部可访问,外部客户端无法连接

内容的提问来源于stack exchange,提问作者user21338291

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:24:56