提供一个读取CAP文件的类

本文介绍了一种用于读取和解析由ethreal生成的CAP文件的方法,并提供了一个跨平台的CapFileReader类,该类可在LINUX和WINDOWS系统中使用。

     最近在做一些协议分析的工作,常常和ETHREAL打交道。 我写好自己的程序后,往往要放到真实的网络环境中去测试,看自己的协议处理程序是否正确。反反复复觉得很不爽。
      于是考虑,如果可以把ETHREAL抓下来的数据直接作为测试数据使用,就方便多了。于是研究了一下CAP文件的格式(见上篇文章),自己写了一个读取CAP文件内容的类,公布给大家,希望能对你们有所用处。
     具体的使用请看压缩包中的README.TXT文件,此代码能同时在LINUX和WINDOWS上使用。
    没有办法添加附件,请需要的朋友发邮件给我:ahfu@qq.com  可以从这里下载:http://download1.youkuaiyun.com/down3/20070516/16191424179.rar


 

CapFileReader类使用说明

功能:读取ethreal生成的CAP格式的文件内的信息
接口说明
CapFileReader(void);  //默认构造函数
~CapFileReader(void);  //析构函数
bool Open(const char* CapFile);  //打开CAP文件,参数为文件的路径
bool Read();  //读取下一个数据段,达到文件末尾返回false
void Close();  //关闭Cap文件的读取
inline unsigned short DataLength() const;  //得到当前数据段的数据长度,要先调用Read()方法
bool GetSourceMacAddr(char* Buffer, int Length);  //得到当前数据段的源网卡物理地址,要先调用Read()方法
bool GetDestMacAddr(char* Buffer, int Length);  //得到当前数据段的目的网卡物理地址,要先调用Read()方法
bool GetIPHeader(IP_HEADER& ip);  //假设当前数据段的协议是IP协议,获得IP协议的头信息,要先调用Read()方法
bool GetIPData(int HeadLen, char* Buffer, int Length);  //假设当前的数据段的协议是IP协议,获得IP协议的内容,要先调用Read()方法
bool GetInternetData(char* Buffer, int Length);  //得到Internet协议的内容,包括ARP、IP等,要先调用Read()方法
inline time_t GetStartTime() const;  //得到开始抓包的时间
inline unsigned int GetMicroSecond() const;  //得到当前数据段相对开始抓包时间的微秒数,要先调用Read()方法
inline unsigned short GetInternetProtocol() const;  //得到当前数据段的协议标识,要先调用Read()方法

使用示例:
CapFileReader cap;
if (!cap.Open("1.cap"))
{
    printf("File not exists!\n");
    return;
}
IP_HEADER ip;
while (cap.Read())
{
    if (cap.GetInternetProtocol()==PROTOCOL_IP)
    {
        if (!cap.GetIPHeader(ip))
        {
            printf("Get IP Header fail!\n");
            continue;
        }
        if (ip.Proto == PROTOCOL_TCP)
        {
            printf("TCP\n");
        }
        else if (ip.Proto == PROTOCOL_UDP)
        {
            printf("UDP\n");
        }
        else
        {
            printf("IP\n");
        }
    }
    else if (cap.GetInternetProtocol()==PROTOCOL_ARP))
    {
        printf("ARP\n");
    }
    else
    {
        printf("unknown\n");
    }
}
cap.Close();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值