将pcap文件读入某个缓冲区

时间:2018-03-17 11:51:17

标签: c++ file pcap

任何人都可以提供c ++代码来将pcap文件读入缓冲区吗?请指定我需要添加的头文件以有效地执行任务。

我没有尝试任何事情,因为我对此一无所知。

1 个答案:

答案 0 :(得分:0)

您是否在线搜索过pcap库?要求我们为你找到它是不合适的,所以要把自己打倒。

你只需要 - 惊喜 - pcap.h。里面有一个文件头的结构,我个人定义了自己的16字节包头结构,因为pcap_pkthdr中的pcap.h结构在64位机器上将是24字节,但是磁盘大小总是16个字节:它只是32位整数,包括秒 - 自 - 纪元,纳秒,捕获期间看到的实际数据长度,pcap文件中捕获的数据长度(可能更少) - 检查pcap_pkthdr最后两个的顺序,因为我不记得了。我只有内存映射文件并使用上面的结构来解析它。我怀疑pcap库包含可用于打开文件的函数,如果您愿意,则解析文件头和数据包标题 - 我确信它将有文档。

如果你遇到困难,请回复一个正确的问题,代码等。

所以,你确实回来了代码 - 粘贴在下面的评论,并在此处格式化以便于阅读:

pthread_t td;
pcapNext = true; 
unsigned long fileLen; 
std::string pcapfile = "packet.pcap"; 
std::cout << "FileName :" << pcapfile << std::endl; 
pcap_t* pcap; 
char errbuf[PCAP_ERRBUF_SIZE]; 
struct pcap_pkthdr header; 
pcap = pcap_open_offline(pcapfile.c_str(), errbuf); 
if (pcap == NULL)
{
    fprintf(stderr, "error reading pcap file: %s\n", errbuf);
    exit(1);
} 
int pktCount = 0; 
const unsigned char* packet; 
while ((packet = pcap_next(pcap, &header)) != NULL && pcapNext)
{ 
    usleep(50000); 
    const unsigned char* packet1 = packet; 
    pktCount++; 
    packet = NULL;
} 
fileLen = ftell(pcap);

buffer = (char*)malloc(fileLen + 1); 
if (!buffer)
{ 
    fprintf(stderr, "Memory error!");
    fclose(pcap);
    return;
}
fread(buffer, fileLen, 1, pcap);
std::cout << "Pcap_File_Close...." << std::endl;
fclose(pcap);

这让我觉得非常奇怪。您通常希望对while循环中的每个数据包进行一些处理,但是您反而跳过数据包然后尝试从文件末尾读取数据:如果您位于文件的末尾,我假设您正在读取0个字节但是您没有检查读取的字节数或对数据执行任何操作。无论如何,即使你在读取这样的文件之前回到第一个数据包,你也会收集所有的数据包标题,无论如何都要自己再解析它,那么重点是什么呢?