调用pcap_sendpacket时真实Wi-Fi设备报Error 31,回环设备正常
问题背景
编译运行Npcap SDK 1.13中的sendpack.c示例时,回环接口(Microsoft Wi-Fi Direct Virtual Adapter)发包正常,但真实TP-Link Wireless USB Wi-Fi接口调用pcap_sendpacket返回错误:
send error: PacketSendPacket failed: A device attached to the system is not functioning. (31)
Wireshark基于Npcap可正常捕获该接口数据包,已尝试重新插拔适配器、重启系统、重装Npcap,问题未解决。
可能的原因与解决方案
1. 确认Npcap安装时启用无线原始发包支持
重装Npcap时,务必勾选**Support raw 802.11 traffic and monitor mode (requires wireless hardware)**选项。该选项默认可能未启用,是Wi-Fi接口发送原始数据包的必要前提。
2. 以管理员权限运行程序
Windows系统下,发送原始网络数据包需要管理员权限。右键程序图标,选择「以管理员身份运行」后再测试发包功能。
3. 为Wi-Fi接口开启监控模式
原sendpack.c示例未开启监控模式,而真实Wi-Fi接口通常需要切换到监控模式才能发送原始帧。在打开接口后添加监控模式设置代码:
// 打开接口后插入以下代码 if (pcap_set_rfmon(handle, 1) != 0) { fprintf(stderr, "Warning: 无法设置监控模式: %s\n", pcap_geterr(handle)); }
注意:部分Wi-Fi适配器可能不支持监控模式,需确认硬件兼容性。
4. 修改发送的数据包格式为802.11帧格式
原示例发送的是以太网(Ethernet)帧格式,而Wi-Fi接口在监控模式下仅支持802.11 MAC帧格式。替换示例中的packet数组为符合802.11规范的帧数据,例如简化的802.11数据帧:
u_char packet[] = { 0x08, 0x00, // 802.11帧控制字段(数据帧) 0x00, 0x00, // 持续时间字段 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 目标MAC 0x00, 0x0c, 0x29, 0x69, 0x54, 0x1c, // 源MAC 0x00, 0x0c, 0x29, 0x69, 0x54, 0x1c, // BSSID 0x00, 0x00, // 序列号/片段号 // 后续IP数据报内容 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, 0xf7, 0x61, 0xc0, 0xa8, 0x00, 0x02, 0xc0, 0xa8, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21 };
5. 更新Wi-Fi适配器驱动
TP-Link Wireless USB Adapter的旧版本驱动可能与Npcap存在兼容性问题。前往TP-Link官方网站下载并安装对应型号的最新Windows 11驱动,重启系统后测试。
6. 验证接口状态
使用pcap_findalldevs枚举接口时,检查目标Wi-Fi接口的标志位是否包含PCAP_IF_UP和PCAP_IF_RUNNING,确保接口处于正常运行状态。
内容的提问来源于stack exchange,提问作者Guy Dror

