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

Python使用UDP Socket出现WinError 10054错误,为何会发生?

关于UDP套接字出现Errno 10054错误的原因及解决办法

首先明确:UDP确实是无连接协议,但这并不代表不会出现"连接重置"类的错误——你遇到的Errno 10054(对应Windows的WSAECONNRESET)本质是ICMP端口不可达报文的上层映射,和TCP的连接重置不是一回事。

错误触发的具体原因

你的代码逻辑是:

  1. 创建UDP套接字并绑定本地端口
  2. 向127.0.0.1:3943发送数据报
  3. 调用recv()等待接收数据

问题出在第二步:如果目标端口3943没有任何程序在监听UDP数据,目标主机的TCP/IP栈会返回一个ICMP端口不可达的报文给你的套接字。在Windows系统中,系统会把这个ICMP错误转换为WSAECONNRESET错误,并关联到你的UDP套接字上。当你后续调用recv()时,系统就会抛出这个错误,而不是一直阻塞等待数据。

而当你移除sendto语句后,套接字从未发送过数据,自然不会收到ICMP错误报文,recv()就会正常阻塞等待数据,不会触发异常。

解决办法

  1. 确认目标端口有UDP服务监听
    先检查127.0.0.1:3943是否真的有UDP程序在运行并绑定该端口,只有目标端口处于监听状态,你的发送才不会触发ICMP错误。

  2. 修改代码处理异常或避免阻塞
    可以通过设置超时、捕获异常或者使用recvfrom()来处理这种情况,示例代码如下:

    import socket
    
    b = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    b.bind(('127.0.0.1', 12000))
    # 设置5秒接收超时
    b.settimeout(5)
    
    try:
        b.sendto(b"check", ('127.0.0.1', 3943))
        # 用recvfrom可以同时获取发送方地址
        data, addr = b.recvfrom(48)
        print(f"收到来自{addr}的数据: {data}")
    except socket.timeout:
        print("接收超时,可能目标端口无UDP服务监听")
    except ConnectionResetError as e:
        print(f"触发错误: {e},大概率是目标端口未监听UDP")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:27:54