最近在做一些协议分析的工作,常常和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();
本文介绍了一种用于读取和解析由ethreal生成的CAP文件的方法,并提供了一个跨平台的CapFileReader类,该类可在LINUX和WINDOWS系统中使用。
432

被折叠的 条评论
为什么被折叠?



