C++ 读取 pcap文件.
http://blog.csdn.net/haolipengzhanshen/article/details/51854853
1.了解下pcap文件的结构
2.定义pcap文件头部结构体pcapFileHeader_t,
定义pcap数据包头部结构体pcapPkthdr_t
3.代码实现
base_type.h
#ifndef BASE_TYPE_H
#define BASE_TYPE_H
typedef unsigned char uchar8_t;
typedef char char8_t;
typedef unsigned short uint16_t;
typedef short int16_t;
typedef unsigned int uint32_t;
typedef int int32_t;
typedef unsigned long ulong64_t;
typedef long long64_t;
const uint32_t MAX_MTU = 1500; //设置最大MTU为1500
const int ETHER_DATA_MIN_SIZE = 28; //IP头长度 + UDP 长度
const int HTTP_PORT_NUMBER = 80; //默认HTTP端口号
#endif
- 1
pcap.h
#ifndef PCAP_H
#define PCAP_H
#include "base_type.h"
#include <queue>
#include <fstream>
#include <iostream>
using namespace std;
#define PCAP_FILE_MAGIC_1 0Xd4
#define PCAP_FILE_MAGIC_2 0Xc3
#define PCAP_FILE_MAGIC_3 0Xb2
#define PCAP_FILE_MAGIC_4 0Xa1
/*pcap file header*/
typedef struct pcapFileHeader
{
uchar8_t magic[4];
uint16_t version_major;
uint16_t version_minor;
int32_t thiszone; /*时区修正*/
uint32_t sigfigs; /*精确时间戳*/
uint32_t snaplen; /*抓包最大长度*/
uint32_t linktype; /*链路类型*/
} pcapFileHeader_t;
/*pcap packet header*/
typedef struct pcapPkthdr
{
uint32_t seconds; /*秒数*/
uint32_t u_seconds; /*毫秒数*/
uint32_t caplen; /*数据包长度*/
uint32_t len; /*文件数据包长度*/
} pcapPkthdr_t;
class Pcap
{
public:
Pcap(const char* fileName);
~Pcap();
void parsePcapFile(queue<string>& rawQueue);
private:
ifstream fileHandler;
const char* fileName;
};
#endif
1
- 2
pcap类只有一个parsePcapFile接口,fileName记录pcap文件的名称
pcap.cpp
#include "pcap.h"
Pcap::Pcap(const char* fileName)
{
this->fileName = fileName;
}
void Pcap::parsePcapFile(queue<string>& rawQueue)
{
pcapFileHeader_t pcapFileHeader = {0};
pcapPkthdr_t packetHeader = {0};
fileHandler.open(fileName);
if (!fileHandler)
{
cout << "The file does not exits or file name is error" << endl;
return;
}
//读取pcap文件头部长度
fileHandler.read((char8_t*)&pcapFileHeader, sizeof(pcapFileHeader));
if (pcapFileHeader.magic[0] != PCAP_FILE_MAGIC_1 || pcapFileHeader.magic[1] != PCAP_FILE_MAGIC_2 ||
pcapFileHeader.magic[2] != PCAP_FILE_MAGIC_3 || pcapFileHeader.magic[3] != PCAP_FILE_MAGIC_4)
{
cout << "The file is not a pcap file" << endl;
return;
}
while (fileHandler.read((char8_t*)&packetHeader, sizeof(packetHeader)))
{
uint32_t len = packetHeader.caplen;
// if (packetHeader.caplen != packetHeader.len)
{
//cout << "It is a invalid packet" << endl;
//fileHandler.seekg(packetHeader.caplen, ios::cur);
//continue;
}
char8_t *buf = new char8_t[len];
if (NULL == buf)
{
return;
}
fileHandler.read(buf, len);
string temp(buf, len);
rawQueue.push(temp);
delete buf;
}
}
Pcap::~Pcap()
{
fileHandler.close();
}
- 1
其实Linux平台下的libpcap库也能处理pcap的离线文件,比如tcpflow的C++版本的-r参数就是处理pcap离线文件的
待时间充裕玩玩看看,分析出来个思路来.
C++ 读取 pcap文件.的更多相关文章
- pcap文件生成metadata——使用tshark解析tcpdump的pcap包
pcap文件生成metadata #!/usr/bin/env python # -*- coding: utf-8 -*- import os import time, datetime impor ...
- python dpkt 解析 pcap 文件
dpkt Tutorial #2: Parsing a PCAP File 原文链接:https://jon.oberheide.org/blog/2008/10/15/dpkt-tutorial-2 ...
- text2pcap: 将hex转储文本转换为Wireshark可打开的pcap文件
简介 Text2pcap是一个读取ASCII hex转储的程序,它将描述的数据写入pcap或pcapng文件.text2pcap可以读取包含多个数据包的hexdumps,并构建多个数据包的捕获文件.t ...
- Unity3D移动平台动态读取外部文件全解析
前言: 一直有个想法,就是把工作中遇到的坑通过自己的深挖,总结成一套相同问题的解决方案供各位同行拍砖探讨.眼瞅着2015年第一个工作日就要来到了,小匹夫也休息的差不多了,寻思着也该写点东西活动活动大脑 ...
- python读取caffemodel文件
caffemodel是二进制的protobuf文件,利用protobuf的python接口可以读取它,解析出需要的内容 不少算法都是用预训练模型在自己数据上微调,即加载"caffemodel ...
- informatica读取FTP文件
以下为一个完整的informatica读取ftp文件,并导入到系统中. 第一步: 通过shell脚本下载压缩包文件 /server/infa_shared/crm_prod/shell/ftpFrom ...
- Java读取word文件,字体,颜色
在Android读取Word文件时,在网上查看时可以用tm-extractors,但好像没有提到怎么读取Word文档中字体的颜色,字体,上下标等相关的属性.但由于需要,要把doc文档中的内容(字体,下 ...
- 五种方式让你在java中读取properties文件内容不再是难题
一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...
- Javascript写入txt和读取txt文件的方法
文章主要介绍了Javascript写入txt和读取txt文件的方法,需要的朋友可以参考下1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码 代码如下: Va ...
随机推荐
- 开源 java CMS - FreeCMS2.3 Web页面信息採集
原文地址:http://javaz.cn/site/javaz/site_study/info/2015/23312.html 项目地址:http://www.freeteam.cn/ Web页面信息 ...
- Android下将图片载入到内存中
Android的系统的标准默认每一个应用程序分配的内存是16M.所以来说是很宝贵的,在创建应用的时候要尽可能的去节省内存,可是在载入一些大的文件的时候,比方图片是相当耗内存的,一个1.3M的图片,分辨 ...
- Word2010编号列表&多级列表
1.引用场景 对于一份标准.漂亮的word文档,编号列表和多级列表的设置时必不可少的,正因为有它们,文档看起来才更专业,使用起来才更加的方便.如下面截图一般,这是十分常见的多级列表设置 ...
- DDNS 的工作原理及其在 Linux 上的实现--转
http://www.ibm.com/developerworks/cn/linux/1305_wanghz_ddns/index.html DDNS (Dynamic DNS) 扩展了 DNS 将客 ...
- QTP自学攻略
QTP自学攻略 自学总是很痛苦的,看大量的书籍,可是学到的东西却不是那么实用,下面整理了一些在QTP中经常需要的函数,以及方法很实用! QTP常用函数 1, 获取对话框相应的文字: GetVisi ...
- jQuery的动画效果
jQuery 是一个 JavaScript 库.jQuery 库可以通过一行简单的标记被添加到网页中. <script type="text/javascript" src= ...
- Jquery解析Json字符串,并且动态生成数据表格Table
//ajax获得后台传来的json字符串 $.post("UserInfo.ashx", function (data) { //假设data="{T1:[{User_I ...
- Number Game poj1143
Description Christine and Matt are playing an exciting game they just invented: the Number Game. The ...
- PHP读书笔记(3)-常量
什么是常量 什么是常量?常量可以理解为值不变的量 :或者是常量值被定义后,在脚本的其他任何地方都不可以被改变.手册上是这么定义PHP的常量:常量是一个简单值的标识符(名字).如同其名称所暗示的,在脚本 ...
- 插入到Mysql数据库中的汉字乱码
出现这个问题,大都是在Mysql安装的时候没有选择成UTF8,默认安装的话应该是latin编码 安装完成之后后期可以在配置文件中修改. 打开Mysq的安装位置,查看my.ini文件. 修改如下设置编码 ...