Python使用socket的connect_ex做端口测试如何调整超时为30秒
Python socket
connect_ex 超时时间调整方案 可以调整该超时等待时间,Python socket库提供了两种常用的实现方案:
方案1:直接设置socket全局超时(最简实现)
通过settimeout()方法给socket对象设置全局超时时间后调用connect_ex(),超时后会直接返回对应错误码,无需等待系统默认的2分钟超时:
import socket test_ip = "192.168.1.1" test_port = 80 connect_timeout = 30 # 创建TCP socket对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置全局超时时间为30秒 s.settimeout(connect_timeout) # 发起连接测试 return_code = s.connect_ex((test_ip, test_port)) if return_code == 0: print("端口开放,连接成功") else: print(f"连接失败,错误码:{return_code}") s.close()
方案2:非阻塞模式+select精准控制连接超时(适合复杂场景)
如果只需要限制连接阶段的超时、不影响后续socket收发数据的超时配置,可以用非阻塞模式配合select实现精准控制:
import socket import select test_ip = "192.168.1.1" test_port = 80 connect_timeout = 30 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设为非阻塞模式 s.setblocking(False) # 发起连接,非阻塞模式下会立即返回EINPROGRESS错误码表示连接正在处理中 init_code = s.connect_ex((test_ip, test_port)) if init_code == 0: print("端口开放,连接成功") else: # 用select监听socket可写事件,超时设为30秒 writable, _, _ = select.select([], [s], [], connect_timeout) if writable: # 获取连接最终结果 final_code = s.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) if final_code == 0: print("端口开放,连接成功") else: print(f"连接失败,错误码:{final_code}") else: print("连接超时,端口不可达") s.close()
注意事项
- 方案1代码逻辑更简单,适合仅做端口连通性测试、不需要复用socket的场景
- 方案2控制粒度更细,仅限制连接阶段的超时,适合测试完成后需要继续使用该socket收发数据的场景
- 不同操作系统的连接失败错误码存在差异,判断连接成功仅需校验返回值是否为0即可,不需要匹配特定错误码
内容的提问来源于stack exchange,提问作者riverstack ma
相关产品推荐
相关产品推荐

