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

Python UDP服务器启动失败报WinError 10045错误求助

问题分析与修复:UDP服务器代码触发WinError 10045

你的代码核心问题是混淆了TCP和UDP的Socket API用法:

错误原因

你创建的是UDP类型的Socket(socket.SOCK_DGRAM),但却调用了TCP专属的accept()方法。UDP是无连接协议,不需要提前建立连接,accept()操作仅适用于TCP Socket,UDP Socket不支持该操作,因此抛出WinError 10045错误。

同时,后续的client.recv()和client.send()也是TCP的用法——TCP需要维护连接,accept()会返回新的Socket用于和客户端通信;而UDP不需要连接,所有收发都基于最初创建的同一个Socket。

修复后的代码

import socket

if __name__ == '__main__':
    bind_ip = "0.0.0.0"
    bind_port = 30335
    
    # 初始化UDP Socket
    server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    server.bind((bind_ip, bind_port))
    
    print(f"[*] Listening on {bind_ip}:{bind_port}")
    
    while True:
        # UDP用recvfrom()接收数据,同时获取发送方地址
        data, addr = server.recvfrom(1024)
        print(f"Received from {addr}: {data.decode('utf-8')}")
        
        # 用sendto()向发送方回复,必须指定目标地址
        server.sendto(b"ACK!", addr)

关键改动说明

  1. 替换accept()为recvfrom():
    UDP通过recvfrom()一次性获取客户端发送的字节数据,以及客户端的IP和端口地址,无需提前建立连接。
  2. 替换recv()/send()为recvfrom()/sendto():
    因为UDP无连接,每次发送数据都需要明确指定目标地址,sendto()需要传入字节类型的数据和目标地址元组。
  3. 字节与字符串转换:
    recvfrom()返回的data是字节对象,用decode('utf-8')可转为可读字符串;发送的回复需要是字节类型(在字符串前加b前缀)。

额外说明

TCP是面向连接的协议,需要通过listen()、accept()建立连接后,再用新的Socket和客户端通信;而UDP是无连接的,每个数据包独立传输,服务器不需要维护客户端连接状态,所有收发操作都基于同一个Socket完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:13:10