将 pcap 文件读取到向量/数组

Reading pcap file to vector/array

本文关键字:向量 数组 读取 pcap 文件      更新时间:2023-10-16

我正在尝试将pcap文件读取到某些数据结构,例如向量或数组,然后在应用程序中使用收集的数据(仅选择数据包长度,时间戳等数据)。我找到了一些用于读取 pcap 的示例应用程序:

#include <stdio.h>
#include <pcap.h>
#define LINE_LEN 16
void dispatcher_handler(u_char *, const struct pcap_pkthdr *, const u_char *);
int main(int argc, char **argv)
{
    pcap_t *fp;
    char errbuf[PCAP_ERRBUF_SIZE];
    if(argc != 2)
    {
        printf("usage: %s filename", argv[0]);
        return -1;
    }
    /* Open the capture file */
    if ((fp = pcap_open_offline(argv[1],            // name of the device
                         errbuf                 // error buffer
                         )) == NULL)
    {
        fprintf(stderr,"nUnable to open the file %s.n", argv[1]);
        return -1;
    }
    /* read and dispatch packets until EOF is reached */
    pcap_loop(fp, 0, dispatcher_handler, NULL);
    pcap_close(fp);
    return 0;
}

void dispatcher_handler(u_char *temp1,
                        const struct pcap_pkthdr *header,
                        const u_char *pkt_data)
{
    u_int i=0;
    /*
     * unused variable
     */
    (VOID*)temp1;
    /* print pkt timestamp and pkt len */
    printf("%ld:%ld (%ld)n", header->ts.tv_sec, header->ts.tv_usec, header->len);
    printf("nn");
}

问题出在pcap_loop().我已经找到了这方面的文档,但唯一的信息是这是读取整个文件,直到到达文件末尾。我一直在尝试将文件视为典型的FILE,并在while循环中读取直到EOF,但它不起作用,因为我不能简单地将fp视为FILE

此外,我认为没有任何可能将指针传递给pcap_handler以便稍后检索它。

有人可以建议我如何以其他方式做到这一点吗?

根据文档,您的代码看起来是正确的。 pcap_loop应该进行文件读取,您不应该尝试这样做。

文档提到的一件事是,在较旧的 pcap 版本中,pcap_loop 中的计数为 0 是未定义的,因此在链接到旧版本的情况下使用 -1 应该更安全。

经过进一步的文档和互联网调查,我发现了功能:pcap_next_ex()

多亏了这一点,我现在可以使用 while 循环并逐行读取(或者更准确地说是逐个数据包)。总体思路如下:

struct pcap_pkthdr *header;
const u_char *pkt_data;
int res;
while((res = pcap_next_ex(fp, &header, &pkt_data)) >= 0)
{
    //Process packet
}

我一直在尝试将文件视为典型的FILE,并在while循环中读取直到EOF,但它不起作用,因为我不能简单地将fp视为FILE

不,因为它不是FILE. (您还可以从pcap_open_live()pcap_create()/pcap_activate()组合中获得pcap_t *,但这为您提供了实时捕获的句柄,而不是文件的句柄。

此外,我认为没有任何可能将指针传递给pcap_handler以便稍后检索它。

pcap_loop()的第四个参数作为第一个参数传递给pcap_handler,所以你可以这样做

pcap_loop(fp, 0, dispatcher_handler, pointer);

然后,在 dispatcher_handler() 中,将temp1转换为适当的类型并使用它 - 它将指向与pointer相同的事情。