WinPcap手册中的例子:
1 #define _XKEYCHECK_H 2 #include "pcap.h" 3 #include <winsock2.h> 4 #include <string.h> 5 #include <iostream> 6 7 #pragma comment(lib, "wpcap.lib") 8 #pragma comment(lib, "Ws2_32.lib") 9 10 using namespace std; 11 12 /* packet handler 函数原型 */ 13 void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data); 14 15 int main() 16 { 17 pcap_if_t *alldevs; 18 pcap_if_t *d; 19 int inum; 20 int i=0; 21 pcap_t *adhandle; 22 char errbuf[PCAP_ERRBUF_SIZE]; 23 24 /* 获取本机设备列表 */ 25 if (pcap_findalldevs(&alldevs, errbuf) == -1) 26 { 27 fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf); 28 exit(1); 29 } 30 31 /* 打印列表 */ 32 for(d=alldevs; d; d=d->next) 33 { 34 printf("%d. %s", ++i, d->name); 35 if (d->description) 36 printf(" (%s)\n", d->description); 37 else 38 printf(" (No description available)\n"); 39 } 40 41 if(i==0) 42 { 43 printf("\nNo interfaces found! Make sure WinPcap is installed.\n"); 44 return -1; 45 } 46 47 printf("Enter the interface number (1-%d):",i); 48 scanf("%d", &inum); 49 50 if(inum < 1 || inum > i) 51 { 52 printf("\nInterface number out of range.\n"); 53 /* 释放设备列表 */ 54 pcap_freealldevs(alldevs); 55 return -1; 56 } 57 58 /* 跳转到选中的适配器 */ 59 for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++); 60 61 /* 打开设备 */ 62 if ( (adhandle= pcap_open(d->name, // 设备名 63 65536, // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容 64 PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式 65 1000, // 读取超时时间 66 NULL, // 远程机器验证 67 errbuf // 错误缓冲池 68 ) ) == NULL) 69 { 70 fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name); 71 /* 释放设备列表 */ 72 pcap_freealldevs(alldevs); 73 return -1; 74 } 75 76 printf("\nlistening on %s...\n", d->description); 77 78 /* 释放设备列表 */ 79 pcap_freealldevs(alldevs); 80 81 /* 开始捕获 */ 82 pcap_loop(adhandle, 0, packet_handler, NULL); 83 84 return 0; 85 } 86 87 88 /* 每次捕获到数据包时,libpcap都会自动调用这个回调函数 */ 89 void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) 90 { 91 struct tm *ltime; 92 char timestr[16]; 93 time_t local_tv_sec; 94 95 /* 将时间戳转换成可识别的格式 */ 96 local_tv_sec = header->ts.tv_sec; 97 ltime=localtime(&local_tv_sec); 98 strftime( timestr, sizeof timestr, "%H:%M:%S", ltime); 99 100 printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len); 101 102 }
可能会提示pcap_open等函数未定义。需要定义宏 #define HAVE_REMOTE
部分函数说明:
pcap_t * pcap_open(const char* source, int snaplen, int flags, int read_timeout, struct pcap_rmtauth* auth, char* errbuf); /*source:它表示的是设备的名称。在获取适配器链表后,通过返回数据域name即可知道设备的名称。 snaplen: 指定要捕获数据包中的哪些部分。技术文档中介绍说,在一些操作系统中,驱动可以被配置成只捕获数据包的初始化部分,它的好处就是可以减少应用程序间复制数量的量, 从而提高捕获效率。下面将要给出的实例程序中设为65535。我们知道对于使用以太网的局域网来说,最大传输单元为1500字节,那么设为65535则能保证收到完整的数据包。 flags: 是最重要的一个值,它用来指示适配器是否需要设置成混杂模式,这里引用一下技术文档中对设置混杂模式的说明: 一般情况下,适配器只接收发给它自己的数据包, 而那些在其他机器之间通讯的数据包,将会被丢弃。 相反,如果适配器是混杂模式,那么不管这个数据包是不是发给我的,我都会去捕获。 也就是说,我会去捕获所有的数据包。 这意味着在一个共享媒介(比如总线型以太网),WinPcap能捕获其他主机的所有的数据包。 大多数用于数据捕获的应用程序都会将适配器设置成混杂模式, 所以,我们也会在下面的范例中,使用混杂模式。 它的意思就是说设置混杂模式可以捕获到所有经过适配器的数据包,不论是不是发给机器本身的。PCAP_OPENFLAG_PROMISCUOUS这个值就是设置成混杂模式的意思。 read_timeout: 是读取数据的超时时间,单位是毫秒。意思就是说会在read_timeout时间内对适配器的读取操作进行响应,不管有没有读到数据。这里有两个特殊的值需要说明一下, 如果将时间设置为0意味着没有超时,那么如果没有数据到达的话,读操作就永远不会返回;如果设置为 - 1则恰恰相反,不论有没有读到数据都会立即返回。 auth: 它表示的是连接远程用户的验证信息,由于我们不需要连接到远程用户,这里置为NULL。 errbuf: 是错误信息缓冲,如果该函数在调用过程中出错则会将出错信息保存在缓冲中。 函数的返回值 是一个pcap_t的指针类型,查看声明处我们可以发现pcap_t实际上是pcap结构体,而文档上说明它是一个已打开的捕捉实例的描述符。 这个结构体对用户来说是不透明的(我们查看pcap的声明处是找不到的),它通过wpcap.dll提供的函数,维护了它的内容。 */ int pcap_loop(pcap_t*, int, pcap_handler, u_char * user); /*pcap_loop()函数是用来捕获一组数据分组的。pcap_loop()函数跟pcap_dispath()函数很类似,唯一不同之处就是pcap_loop()会一直读数据直到cnt数据被处理或者出现错误。 不论读取时间是否超时它都不返回。当然有一种特殊情况,就是在调用pcap_open()函数时指定非0的读取超时时间,调用pcap_dispath()函数可以在超时发生时对读到的数据进行接收和处理。 将cnt设为正数可以使pcap_loop()一直循环(或至少到错误发生之前)。 返回 - 1则出错;返回0则说明cnt被耗尽;返回 - 2则是由于在数据被处理之前调用pcap_breakloop()来中断循环。如果使用了pcap_breakloop()函数, 需要对返回值 - 1和 - 2进行详细的检查,而不是只检查 < 0的情况。 ps:用户可以通过user指针传递自己的一个参数到回调函数中。 */
参考:
http://t.zoukankan.com/gdayq-p-5866306.html
https://www.cnblogs.com/UnGeek/archive/2012/12/30/2839638.html
标签:char,捕获,函数,数据包,报文,---,WinPcap,pcap,适配器 From: https://www.cnblogs.com/linxisuo/p/16908739.html