在 Windows 10 中使用 C++ 中的 pcap.h 解决 Npcap 的缓冲区大小问题

问题描述 投票:0回答:1

我在 Windows 10 上的 C++ 程序中尝试使用 Npcap 设置大缓冲区大小时遇到问题。使用 WinPcap 时代码可以正常工作,获得所需的 2GB 缓冲区大小,但无法使用 Npcap 获得相同的结果。我正在寻求解决此问题的指导。

示例:

#include <iostream>
#include <pcap.h>

void packet_handler(u_char *user, const struct pcap_pkthdr *pkthdr, const u_char *packet) {
    // Your packet handling logic goes here
    // This function will be called for each captured packet
    std::cout << "Packet captured!" << std::endl;
}

int main() {
    char errbuf[PCAP_ERRBUF_SIZE];

    // Change "eth0" to your network interface name
    const char *dev = "eth0";

    // Open the capture interface
    pcap_t *handle = pcap_open_live(dev, 65536, 1, 1000, errbuf);

    if (handle == nullptr) {
        std::cerr << "Couldn't open device " << dev << ": " << errbuf << std::endl;
        return 1;
    }

    // Set the buffer size
    int buffer_size = 2147483647; // 2 GB
    if (pcap_set_buffer_size(handle, buffer_size) != 0) {
        std::cerr << "Failed to set buffer size: " << pcap_geterr(handle) << std::endl;
        return 1;
    }

    // Start capturing packets
    if (pcap_loop(handle, 0, packet_handler, nullptr) < 0) {
        std::cerr << "Error during packet capture: " << pcap_geterr(handle) << std::endl;
        return 1;
    }

    // Close the capture handle
    pcap_close(handle);

    return 0;
}

我的问题是

pcap_set_buffer_size
在使用 Npcap 时没有获得 2GB RAM!

提供的代码可以在带有 WinPcap 的 Windows 上正常工作,实现所需的 2GB 缓冲区大小。然而,当使用 Npcap 时,相同的代码无法从 RAM 获取预期的缓冲区大小。

c++ pcap winpcap npcap
1个回答
0
投票

在 libpcap 库的当前版本中,包括 Windows 上的 Npcap,必须在激活数据包捕获句柄之前设置缓冲区大小。这意味着您应该在使用 pcap_create 创建捕获句柄之后、使用 pcap_activate 激活它之前设置缓冲区大小。

如果您使用 pcap_open_live(这是一个结合了创建和激活捕获句柄步骤的便利函数),则无法在打开句柄之前设置缓冲区大小。相反,您应该使用 pcap_create 和 pcap_activate 进行更多控制。

使用 pcap_create 和 pcap_activate 的示例代码

// Create the capture handle
pcap_t *handle = pcap_create(device, errbuf);
if (handle == nullptr) {
    std::cerr << "Could not create capture handle: " << errbuf << std::endl;
    return 1;
}

// Set the buffer size to 2 MB (2,097,152 bytes)
if (pcap_set_buffer_size(handle, 2097152) != 0) {
    std::cerr << "Could not set buffer size: " << pcap_geterr(handle) << std::endl;
    pcap_close(handle);
    return 1;
}

// Set the snaplen to 2000 bytes
if (pcap_set_snaplen(handle, 2000) != 0) {
    std::cerr << "Could not set snaplen: " << pcap_geterr(handle) << std::endl;
    pcap_close(handle);
    return 1;
}

// Set promiscuous mode
if (pcap_set_promisc(handle, 1) != 0) {
    std::cerr << "Could not set promiscuous mode: " << pcap_geterr(handle) << std::endl;
    pcap_close(handle);
    return 1;
}

// Set the read timeout
if (pcap_set_timeout(handle, 1000) != 0) {
    std::cerr << "Could not set read timeout: " << pcap_geterr(handle) << std::endl;
    pcap_close(handle);
    return 1;
}

// Activate the capture handle
if (pcap_activate(handle) != 0) {
    std::cerr << "Could not activate capture handle: " << pcap_geterr(handle) << std::endl;
    pcap_close(handle);
    return 1;
}

// Start capturing packets
if (pcap_loop(handle, 0, packetHandler, nullptr) < 0) {
    std::cerr << "Error in pcap_loop: " << pcap_geterr(handle) << std::endl;
    pcap_close(handle);
    return 1;
}

// Close the capture handle
pcap_close(handle);
return 0;

}

这个例子是我使用的,缓冲区大小为 2MB,snaplen 为 2000 字节。

© www.soinside.com 2019 - 2024. All rights reserved.