任何人都可以提供c ++代码来将pcap文件读入缓冲区吗?请指定我需要添加的头文件以有效地执行任务。
我没有尝试任何事情,因为我对此一无所知。
答案 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个字节但是您没有检查读取的字节数或对数据执行任何操作。无论如何,即使你在读取这样的文件之前回到第一个数据包,你也会收集所有的数据包标题,无论如何都要自己再解析它,那么重点是什么呢?