读取 pcap 文件到 vector/array
Reading pcap file to vector/array
我正在尝试将 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("\n\n");
}
问题出在 pcap_loop()
。我为此找到了 documentation,但唯一的信息是它正在读取整个文件,直到到达文件末尾。我一直试图将文件视为典型的 FILE
,并在 while 循环中读取直到 EOF
,但它不起作用,因为我不能简单地将 fp
视为 [=13] =].
我也看不出有任何可能将指针传递给 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
}
I've been trying to treat file as a typical FILE
, and in while loop read until EOF
, but it doesn't work, because I cannot simply treat fp
as FILE
.
不,因为它不是 FILE
。 (您还可以从 pcap_open_live()
或 pcap_create()
/pcap_activate()
组合中获得 pcap_t *
,但这为您提供了实时捕获的句柄,而不是文件的句柄。)
Also I don't see any possibility to pass pointer to pcap_handler
to retrieve it later.
pcap_loop()
的第四个参数作为第一个参数传递给 pcap_handler
,所以你可以做
pcap_loop(fp, 0, dispatcher_handler, pointer);
然后,在 dispatcher_handler()
中,将 temp1
转换为适当的类型并使用它 - 它会指向与 pointer
相同的东西。
我正在尝试将 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("\n\n");
}
问题出在 pcap_loop()
。我为此找到了 documentation,但唯一的信息是它正在读取整个文件,直到到达文件末尾。我一直试图将文件视为典型的 FILE
,并在 while 循环中读取直到 EOF
,但它不起作用,因为我不能简单地将 fp
视为 [=13] =].
我也看不出有任何可能将指针传递给 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
}
I've been trying to treat file as a typical
FILE
, and in while loop read untilEOF
, but it doesn't work, because I cannot simply treatfp
asFILE
.
不,因为它不是 FILE
。 (您还可以从 pcap_open_live()
或 pcap_create()
/pcap_activate()
组合中获得 pcap_t *
,但这为您提供了实时捕获的句柄,而不是文件的句柄。)
Also I don't see any possibility to pass pointer to
pcap_handler
to retrieve it later.
pcap_loop()
的第四个参数作为第一个参数传递给 pcap_handler
,所以你可以做
pcap_loop(fp, 0, dispatcher_handler, pointer);
然后,在 dispatcher_handler()
中,将 temp1
转换为适当的类型并使用它 - 它会指向与 pointer
相同的东西。