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)
关键改动说明
- 替换
accept()为recvfrom():
UDP通过recvfrom()一次性获取客户端发送的字节数据,以及客户端的IP和端口地址,无需提前建立连接。 - 替换
recv()/send()为recvfrom()/sendto():
因为UDP无连接,每次发送数据都需要明确指定目标地址,sendto()需要传入字节类型的数据和目标地址元组。 - 字节与字符串转换:
recvfrom()返回的data是字节对象,用decode('utf-8')可转为可读字符串;发送的回复需要是字节类型(在字符串前加b前缀)。
额外说明
TCP是面向连接的协议,需要通过listen()、accept()建立连接后,再用新的Socket和客户端通信;而UDP是无连接的,每个数据包独立传输,服务器不需要维护客户端连接状态,所有收发操作都基于同一个Socket完成。
内容的提问来源于stack exchange,提问作者JimmyHu
相关产品推荐
相关产品推荐

