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文件.的更多相关文章

  1. pcap文件生成metadata——使用tshark解析tcpdump的pcap包

    pcap文件生成metadata #!/usr/bin/env python # -*- coding: utf-8 -*- import os import time, datetime impor ...

  2. python dpkt 解析 pcap 文件

    dpkt Tutorial #2: Parsing a PCAP File 原文链接:https://jon.oberheide.org/blog/2008/10/15/dpkt-tutorial-2 ...

  3. text2pcap: 将hex转储文本转换为Wireshark可打开的pcap文件

    简介 Text2pcap是一个读取ASCII hex转储的程序,它将描述的数据写入pcap或pcapng文件.text2pcap可以读取包含多个数据包的hexdumps,并构建多个数据包的捕获文件.t ...

  4. Unity3D移动平台动态读取外部文件全解析

    前言: 一直有个想法,就是把工作中遇到的坑通过自己的深挖,总结成一套相同问题的解决方案供各位同行拍砖探讨.眼瞅着2015年第一个工作日就要来到了,小匹夫也休息的差不多了,寻思着也该写点东西活动活动大脑 ...

  5. python读取caffemodel文件

    caffemodel是二进制的protobuf文件,利用protobuf的python接口可以读取它,解析出需要的内容 不少算法都是用预训练模型在自己数据上微调,即加载"caffemodel ...

  6. informatica读取FTP文件

    以下为一个完整的informatica读取ftp文件,并导入到系统中. 第一步: 通过shell脚本下载压缩包文件 /server/infa_shared/crm_prod/shell/ftpFrom ...

  7. Java读取word文件,字体,颜色

    在Android读取Word文件时,在网上查看时可以用tm-extractors,但好像没有提到怎么读取Word文档中字体的颜色,字体,上下标等相关的属性.但由于需要,要把doc文档中的内容(字体,下 ...

  8. 五种方式让你在java中读取properties文件内容不再是难题

    一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...

  9. Javascript写入txt和读取txt文件的方法

    文章主要介绍了Javascript写入txt和读取txt文件的方法,需要的朋友可以参考下1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码 代码如下: Va ...

随机推荐

  1. mysql 5.7.12 新增 X plugin 详解

     https://dev.mysql.com/doc/refman/5.7/en/document-store.html   原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息 ...

  2. ireport启动闪退问题

    安装好ireport之后,双击ireport.exe启动程序只是掠过启动画面便毫无反应, 后来在网上找了下解决方法,才知道只因为ireport与jdk8不兼容, 于是下载了jdk6,并在ireport ...

  3. SSO-Javascript模拟IE登录,不让IIS弹出登录窗口

    解决方案:         用JS模拟IE用户登录,再跳转到对应的系统.   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transiti ...

  4. Boxes in a Line

    Boxes in a Line You have n boxes in a line on the table numbered 1 . . . n from left to right. Your ...

  5. sed程序

    程序1: 实现简单的shell sed替换功能 程序2:修改haproxy配置文件  1.查 输入:www.oldboy.org 获取当前backend下的所有记录 2.新建 输入: arg = { ...

  6. Android(java)学习笔记90:泛型类的概述和使用

    用法一: 下面我们首先定义泛型类: package cn.itcast_04; /* * 泛型类:把泛型定义在类上 */ public class ObjectTool<T> { //这里 ...

  7. 在Code first中使用数据库里的视图

    如果想在Code first中使用数据库里的视图 (不管你出于什么原因),目前的方法有2种. 一.使用Database.SqlQuery<T>("查询语句"),如: v ...

  8. KindEditor图片上传到七牛云

    自己做了一个网站,编辑器用的是KindEditor,平时会涉及到KindEditor自带的图片上传,但是服务器用的是虚拟主机,没多少空间,就一直想着把图片放在免费的云存储空间,之前看KindEdito ...

  9. [未完成][Mooc]关于线程的总结

    进程和线程.Eclipse,QQ都是进程.是程序或者任务的执行过程,是动态性.持有资源(共享内存,共享文件)和线程. 这个资源就是内存. 每个程序在运行的时候都会分配一些内存. Eclipse中的源代 ...

  10. Scala中的偏函数与部分应用函数

    Scala中有PartialFunction的概念, 同时还要一个概念叫Partial Applied Function. 前者译作偏函数, 后者译作"偏应用函数"或"部 ...