使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置

最近的项目要求写一个读写pcap文件的小程序,用来修改pcap中的部分信息,实现pcap的定制。
所以必须学会使用wireshark并能有利用WinPcap库和libpcap库进行开发。
虽然本文记录的都是windows下使用WinPcap进行开发,但是由于希望程序能够跨平台,所以代码中使用的都是库里面的跨平台函数,而不是windows专用的函数。
废话少说。
安装wireshark。这和开发本身无关,只是为了看包方便。 安装WinPcap库。 到http://www.winpcap.org/docs/default.htm下载WinPcap库的zip文件,将下载到的zip(写本文时下载的是WpdPack_4_1_2.zip)解压到一个路径,用表示。里面有五个文件夹,包括docs(文档)、Include(头文件)、Lib(库文件)和两个例子程序。本文都是结合文档编写(差不多是翻译)。下面就是文档截图,怎么用都说的很清楚。
使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置
文章图片
使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置
文章图片
使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置
文章图片

配置开发环境(以vs2010为例) 新建一个vs c++工程。右键点击项目,选择属性。 VC++目录,包含目录包含\Include VC++目录,库目录包含\Lib 使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置
文章图片

C/C++,预处理器,添加WPCAP和HAVE_RMOTE。 连接器,输入,添加wpcap.lib和ws2_32.lib库 使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置
文章图片
使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置
文章图片

其实文档里面都写的很清楚了。 使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置
文章图片


然后,在你需要用到WinPcap库的文件当中包含pcap.h就可以了。


测试 试着读取一个名为test.pcap的文件,看看如何。关于pcap文件的格式,将在下一篇文章中阐述。

#include "pcap.h"#include "stdio.h"int main(int argc, char *argv[]) { char errbuf[100]; pcap_t *pfile = pcap_open_offline("test.pcap", errbuf); if (NULL == pfile) { printf("%s\n", errbuf); return -1; } pcap_pkthdr *pkthdr = 0; const u_char *pktdata = https://www.it610.com/article/0; pcap_next_ex(pfile, &pkthdr, &pktdata); printf("%d\n", pkthdr->caplen); for (bpf_u_int32 i = 0; i < pkthdr->caplen; ++i) { if (0 < i && 0 == i % 16) printf("\n"); printf("%2x ", pktdata[i]); } pcap_close(pfile); return 0; }


程序读取了文件中的第一个数据包,并按照wireshark显示的格式,以十六进制打印出了数据包中的每一个字节。
对比一下,一样的。
使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置
文章图片




程序中pcap_open_offline函数以二进制读方式打开一个已经存好的tcpdump/libpcap格式的文件。
pcap_open_offline需要两个参数,第一个是文件名,第二个是个char类型指针。这个指针用来返回错误信息,只有当打开文件失败时,这个字符串被设置为相应的错误信息并返回空指针。
pcap_next_ex函数,读取下一个数据包。需要pcap_pkthdr**指针(不需要实体)和const u_char**类型的指针。


另一个函数pcap_next可以实现同样的功能。单需要提供一个指向pcap_pkthdr结构体的指针(需要new一个实体)。代码如下。

#include "pcap.h" #include "stdio.h"int main(int argc, char *argv[]) { char errbuf[100]; pcap_t *pfile = pcap_open_offline("test.pcap", errbuf); if (NULL == pfile) { printf("%s\n", errbuf); return -1; } pcap_pkthdr *pkthdr = new pcap_pkthdr; const u_char *pktdata = https://www.it610.com/article/0; pktdata = pcap_next(pfile, pkthdr); printf("%d\n", pkthdr->caplen); for (bpf_u_int32 i = 0; i < pkthdr->caplen; ++i) { if (0 < i && 0 == i % 16) printf("\n"); printf("%2x ", pktdata[i]); } delete pkthdr; pcap_close(pfile); return 0; }




【使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置】

    推荐阅读