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

Windows环境下libpcap无法正常工作的问题排查求助

问题描述

在Windows 11系统中,使用MSYS2编译的MinGW GCC编译器,尝试通过libpcap和Npcap实现简单实时抓包已耗时两天,遇到以下情况:

  • 通过pacman安装并链接了libpcap,Npcap安装时勾选了无线支持、环回驱动、LWF、带无线支持的LWF以及WFP调用驱动(通过NPFInstall.exe),Npcap服务正常运行,Wireshark可正常抓包
  • Wi-Fi网卡不支持监听模式,无法通过WlanHelper.exe尝试该模式

测试代码及报错

初始抓包代码

#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>

static void init_npcap_dll_path ()
{
    BOOL(WINAPI *SetDllDirectory)(LPCTSTR);
    char sysdir_name[512];
    int len;

    SetDllDirectory = (BOOL(WINAPI *)(LPCTSTR)) GetProcAddress(GetModuleHandle("kernel32.dll"), "SetDllDirectoryA");

    if(SetDllDirectory == NULL)
    {
        printf("Error in SetDllDirectory\n");
    }
    else
    {
        len = GetSystemDirectory(sysdir_name, 480);

        if(!len) printf("Error in GetSystemDirectory (%d)\n", GetLastError());

        strcat(sysdir_name, "\\Npcap");

        if(SetDllDirectory(sysdir_name) == 0)
            printf("Error in SetDllDirectory(\"System32\\Npcap\")\n");
    }
}

int main (void)
{
    /* No error here: */
    init_npcap_dll_path();

    /* Modules were loaded successfully */
    HMODULE lib1 = LoadLibrary("wpcap");
    HMODULE lib2 = LoadLibrary("Packet");

    char errbuf[PCAP_ERRBUF_SIZE];
    char *dev = "\\Device\\NPF_{B4B56B26-D9F1-49CF-831F-DD58B7DA5ACC}";
    //char *dev = "b4b56b26-d9f1-49cf-831f-dd58b7da5acc"; /* Tried this as well */

    pcap_t* handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);

    if(handle == NULL)
    {
        fprintf(stderr, "Could not open device %s: %s\n", dev, errbuf);
        return 2;
    }

    return 0;
}

运行后报错:live packet capture is not supported on this system

适配器查找代码

char *dev = pcap_lookupdev(errbuf);

if(dev == NULL)
{
    fprintf(stderr, "Couldn't find default device: %s\n", errbuf);
    return(2);
}

错误信息:no suitable device found

已尝试操作

  • 以管理员身份运行程序,无效
  • 考虑过使用VS并隐式链接Npcap SDK的.lib文件,但不确定是否为正确方向

请问哪里操作出错了?


解决建议
  • 替换MSYS2的libpcap为Npcap官方SDK
    MSYS2自带的libpcap多是针对WinPcap编译的,和Npcap兼容性较差。直接下载Npcap官方SDK,编译时指定链接Npcap提供的libwpcap.a(MinGW版本),同时确保程序能访问C:\Windows\System32\Npcap下的wpcap.dll和Packet.dll。

  • 不要硬编码设备路径,改用枚举方式
    硬编码的设备路径可能因系统或Npcap版本变化失效,且MinGW的路径处理逻辑和VS有差异。使用pcap_findalldevs枚举所有可用设备,从中选择目标设备,能确保拿到正确的设备名称。

  • 调整MinGW编译参数
    编译时需指定Npcap SDK的头文件路径和库路径,同时链接对应库,示例命令(以64位系统为例):

gcc your_code.c -o your_program -I"D:\npcap-sdk\Include" -L"D:\npcap-sdk\Lib\x64" -lwpcap -lPacket

注意替换为你实际的SDK路径,并匹配系统位数(x86/x64)。

  • 检查Npcap安装设置
    安装Npcap时务必勾选「兼容WinPcap API」选项,提升对libpcap代码的兼容性。同时确认Npcap服务(Npcap Packet Driver)处于正常运行状态,可通过服务管理器查看。

  • 删除冗余的手动DLL加载代码
    代码中手动加载wpcap和Packet DLL的操作完全多余,链接器会自动处理库文件的加载。删除这部分代码可避免库版本不匹配的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:54:54