Python使用UDP Socket出现WinError 10054错误,为何会发生?
关于UDP套接字出现Errno 10054错误的原因及解决办法
首先明确:UDP确实是无连接协议,但这并不代表不会出现"连接重置"类的错误——你遇到的Errno 10054(对应Windows的WSAECONNRESET)本质是ICMP端口不可达报文的上层映射,和TCP的连接重置不是一回事。
错误触发的具体原因
你的代码逻辑是:
- 创建UDP套接字并绑定本地端口
- 向
127.0.0.1:3943发送数据报 - 调用
recv()等待接收数据
问题出在第二步:如果目标端口3943没有任何程序在监听UDP数据,目标主机的TCP/IP栈会返回一个ICMP端口不可达的报文给你的套接字。在Windows系统中,系统会把这个ICMP错误转换为WSAECONNRESET错误,并关联到你的UDP套接字上。当你后续调用recv()时,系统就会抛出这个错误,而不是一直阻塞等待数据。
而当你移除sendto语句后,套接字从未发送过数据,自然不会收到ICMP错误报文,recv()就会正常阻塞等待数据,不会触发异常。
解决办法
确认目标端口有UDP服务监听
先检查127.0.0.1:3943是否真的有UDP程序在运行并绑定该端口,只有目标端口处于监听状态,你的发送才不会触发ICMP错误。修改代码处理异常或避免阻塞
可以通过设置超时、捕获异常或者使用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
相关产品推荐
相关产品推荐

