首页 > 其他分享 >WinPcap---捕捉设备报文例子

WinPcap---捕捉设备报文例子

时间:2022-11-20 16:11:41浏览次数:64  
标签:char 捕获 函数 数据包 报文 --- WinPcap pcap 适配器

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

相关文章

  • 03-02 KEY IMXULL 寄存器
    1原理图KEY1<--->GPIO5_1KEY2<--->GPIO4_142寄存器操作指南使能GPIO5和GPIO4的时钟(imx6ull默认使能)查询寄存器可知,GPIO5_CLK_ENABLE使用CCGR1[CG15];GPIO4......
  • 玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数
    SQLite是一个跨平台的轻量级数据库,支持C/C++开发,可用于嵌入式中,关于C/C++使用SQLite的简单实例,之前​​这篇文章​​,已经介绍过一种简单的使用方式。本篇来介绍另一种更加高......
  • Composer 安装->使用
    1、composer官网:http://getcomposer.org中文官网:http://phpcomposer.com1.1安装windows安装方式:Composer-Setup.exe(需要翻墙)通用方式(包含wi......
  • Debian编译安装最新的Linux kernel 6.1.0-rc3
    没有编译过​​Linux kernel的Linux运维工作是不完整的安装必要的包sudoaptupdate-y&&sudoaptinstallmakegccbc-y&&sudoaptinstallpkg-configlibncurses-de......
  • 软考架构-论文练手草稿(面向服务-正文)
    本文结合笔者的实际工作经验,主要论述面向服务的架构在该项目中的具体应用。provider服务提供者主要完成服务的设计、描述、定义和发布等相关工作;registry服务注册中心保证该......
  • go-admin migrate 数据表迁移
    目录nav:title:指令order:3title:migrateorder:10toc:content视频教程应用场景:目录说明数据迁移迁移步骤配置数据库常用命令示例新建模型实例3.1方式一:不编译运......
  • 《ASP.NET Core技术内幕与项目实战》精简集-EFCore2.9:泛型仓储实现IRepository
    本节内容,部分为补充内容,部分涉及到5.2(P131-133)。主要NuGet包:如前章节所述 仓储模式,将数据访问层抽象出来,隐藏了底层对数据源的CRUD操作,这样在应用层或控制器中,我们直接......
  • 2022-2023-1 20221305 《计算机基础与程序设计》第12周学习总结
    2022-2023-120221305《计算机基础与程序设计》第12周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在......
  • P8841 [传智杯 #4 初赛] 竞争得分 ----- 归一化*100
    题目描述为了鼓励大家写出更好的作业,花栗鼠科技大学(HualishuUniversityofScienceandTechnology,HUST)的组原实验采用了竞争得分的方式。具体来说,假设有 nn 个人......
  • Peppa 41-52
    41 Chloespuppetshow.I'mPeppaPig.ThisismyIittIebrother,George.ThisisMummyPig.AndthisisDaddyPig.Peppapig.ChIoe'sPuppetShoW!Peppaandherfa......