【问题标题】:Is '/' really a valid device to find with pcap?'/' 真的是使用 pcap 查找的有效设备吗?
【发布时间】:2016-02-21 02:41:56
【问题描述】:

我在搞乱 libpcap,并运行这个测试代码:

char* device, errbuff[PCAP_ERRBUF_SIZE];

printf("Looking for device...\n");
device = pcap_lookupdev(errbuff);

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

printf("Device found: %s\n", device);

它有效,但它输出以下内容:

Looking for device...
Device found: \

我在 Windows (10) 上,后面的代码继续工作(我可以在必要时发布),所以它似乎这是一个有效的设备,但命名似乎对我来说很奇怪。我是linux出身,所以习惯看ethX等。

如果这不正常,我应该看到什么?

【问题讨论】:

  • 除非 pcap 使用特别奇怪的命名法,否则这不是有效的设备名称。我最好的猜测是 pcap_lookupdev 正在返回一个 UTF-16 字符串(这是 Windows 的本机编码),因此当您将其打印为窄字符串时,您只会看到第一个字符。在对 printf() 的调用中尝试 %ws 看看是否有任何不同。
  • %ws 确实有所作为。它输出:\Device\NPF_{BF9D6116-...}

标签: windows network-programming libpcap winpcap


【解决方案1】:

This appears to be a bug, design limitation, or perhaps just poor documentation in winpcap.

pcap_lookupdev 函数被声明为返回char *,但实际上返回的是wchar_t *。我不清楚相关函数是否也是如此,例如,pcap_open_live 是否实际上需要一个 UTF-16 字符串作为设备名称。如果您的代码有效(没有将字符串显式转换为 ASCII),那么可能所有设备名称参数实际上都是 UTF-16。

这是非常糟糕的做法,但为了确保跨平台兼容性,它可能被认为是必要的邪恶。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多