接收mDNS多播消息时遭遇WinError 10049错误的技术求助
解决WinError 10049:Windows下接收mDNS消息的问题
错误原因
Windows系统不允许直接将UDP套接字绑定到多播地址(如224.0.0.251),这是触发OSError: [WinError 10049]的核心原因,和端口是否被占用无关。
修复方案
将套接字绑定到所有可用网络接口(而非多播地址),同时保留多播组加入的逻辑,即可正常接收mDNS消息。
修改后的代码
import struct import socket MCAST_GRP = '224.0.0.251' MCAST_PORT = 5353 IS_ALL_GROUPS = False sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Windows下必须绑定到所有接口,不能直接绑定多播地址 sock.bind(('', MCAST_PORT)) mreq = struct.pack("4sL", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) # 补充endLoop的定义,或替换为while True endLoop = 0 while endLoop == 0: data, addr = sock.recvfrom(10240) print(f"Received message from {addr}:\n{data}")
关键说明
- 绑定
('', MCAST_PORT)等价于绑定('0.0.0.0', MCAST_PORT),表示监听本机所有网络接口的5353端口。 IP_ADD_MEMBERSHIP选项确保套接字加入224.0.0.251多播组,只会接收发往该组的消息,和IS_ALL_GROUPS=False的预期一致。- 如果需要接收所有多播组的消息,只需移除
IP_ADD_MEMBERSHIP的设置即可。
内容的提问来源于stack exchange,提问作者somedude
相关产品推荐
相关产品推荐

