Windows10下调用Python socket.ioctl()设置混杂模式报错WinError 10022
错误触发根因
这个错误的核心触发原因是Windows平台对raw socket的固有约束:调用SIO_RCVALL开启全数据包接收权限时,关联的socket不能绑定到通配地址(""/0.0.0.0),必须绑定到某一块具体物理网卡的单播IPv4地址,否则系统会判定参数非法,抛出10022错误。
解决方案
1. 确认目标网卡IP
先查询你需要抓包的网卡对应的IPv4地址,例如本地以太网网卡地址为192.168.3.45,后续绑定操作使用该地址即可。
2. 调整代码逻辑
修改后的可运行代码如下:
import socket # 替换为实际需要监听的网卡IPv4地址 TARGET_NIC_IP = "192.168.3.45" sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) # 绑定指定网卡IP,端口填0无实际意义 sniffer.bind((TARGET_NIC_IP, 0)) sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) try: data = sniffer.recvfrom(65535) print(f"RECVD : {data}") finally: # 异常场景下也确保关闭混杂模式、释放socket sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF) sniffer.close()
其他注意事项
- 代码仍需要以管理员身份运行,否则raw socket创建阶段就会触发权限错误
- 如需监听多块网卡,需要为每块网卡单独创建socket、绑定对应IP、开启混杂模式
- 部分虚拟网卡(VPN、虚拟机适配网卡等)可能不支持混杂模式配置,遇到报错可切换到物理网卡测试
内容的提问来源于stack exchange,提问作者JA3G3R
相关产品推荐
相关产品推荐

