将 pcap 文件读入某个缓冲区
Reading pcap file into some buffer
任何人都可以提供 c++ 代码来将 pcap 文件读入缓冲区吗?请指定我需要添加的头文件以有效地执行任务。
我没有尝试过任何东西,因为我对此一无所知。
你在网上搜索过pcap库吗?要求我们为您找到它是题外话,所以请尽情享受吧。
你只需要 - 惊喜惊喜 - pcap.h
。里面有文件 header 的结构,我个人定义了自己的 16 字节数据包 header 结构,因为 pcap.h
中的 pcap_pkthdr
结构在 64 位上将是 24 字节机器,但 on-disk 大小始终为 16 字节:它只是 32 位整数 seconds-since-epoch,纳秒,捕获期间看到的实际数据的长度,pcap 文件中捕获的数据长度(可以更少) - 检查 pcap_pkthdr
最后两个的顺序,我不记得了。我只对文件进行过内存映射并使用上述结构来解析它。我怀疑 pcap 库包含可用于打开文件、解析文件 header 和数据包 headers 的函数(如果您愿意的话)——我相信它会有文档。
如果您遇到困难,请返回正确的问题、代码等。
所以,您确实带回了代码 - 粘贴为下面的注释并在此处格式化以便于阅读:
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 个字节,但您没有检查读取的字节数或对数据执行任何操作。无论如何,即使你在像那样读取文件之前返回到第一个数据包,你也会收集所有数据包 headers 并且无论如何都必须自己重新解析它,那有什么意义呢?
任何人都可以提供 c++ 代码来将 pcap 文件读入缓冲区吗?请指定我需要添加的头文件以有效地执行任务。
我没有尝试过任何东西,因为我对此一无所知。
你在网上搜索过pcap库吗?要求我们为您找到它是题外话,所以请尽情享受吧。
你只需要 - 惊喜惊喜 - pcap.h
。里面有文件 header 的结构,我个人定义了自己的 16 字节数据包 header 结构,因为 pcap.h
中的 pcap_pkthdr
结构在 64 位上将是 24 字节机器,但 on-disk 大小始终为 16 字节:它只是 32 位整数 seconds-since-epoch,纳秒,捕获期间看到的实际数据的长度,pcap 文件中捕获的数据长度(可以更少) - 检查 pcap_pkthdr
最后两个的顺序,我不记得了。我只对文件进行过内存映射并使用上述结构来解析它。我怀疑 pcap 库包含可用于打开文件、解析文件 header 和数据包 headers 的函数(如果您愿意的话)——我相信它会有文档。
如果您遇到困难,请返回正确的问题、代码等。
所以,您确实带回了代码 - 粘贴为下面的注释并在此处格式化以便于阅读:
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 个字节,但您没有检查读取的字节数或对数据执行任何操作。无论如何,即使你在像那样读取文件之前返回到第一个数据包,你也会收集所有数据包 headers 并且无论如何都必须自己重新解析它,那有什么意义呢?