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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:45:03