利用winpcap捕获发送数据包.pdfVIP

  • 2
  • 0
  • 约1.24万字
  • 约 10页
  • 2020-09-13 发布于江苏
  • 举报
利用 winpcap 捕获数据包、发送数据包 在上一章里面,我们学会了如何获取适配器的相关配置信息,在这一章里面,我们将继 续更有意义的内容,就是捕获和发送数据包。 3.1 winpcap 捕获数据包流程与相关函数 计算机是通过网卡和网络中其他的主机进行通信的,网卡相当于数据包进出的大门,我 们平时讲的数据包的捕获相当于大门的门卫在检查进出的行人一样。在网络基础我们学习过, 数据包的发送是一个封装的过程,而数据包的接收则是解封装的过程,但是封装和解封装都 是在 OS 内核来完成的,一般的应用程序没办法获取数据包原始的内容,而Winpcap 却能提 供这样的功能,在数据链路层捕获数据包,提供最原始的信息。其中 Winpcap 捕获数据的 原理在第一章已经介绍过了,大家可以回顾下。 另外,数据捕获只能捕获通过本主机网卡的数据,没法捕获其他主机上网卡的数据。 下面先看看 Winpcap 捕获数据时的工作流程。 选择捕获数据的网卡 打开该网卡 开始捕获 结束 数据捕获的流程 1. 发现网络设备的函数(find_dev_ex) 以前已经介绍过了。 2 .打开网卡的函数 打开设备的函数是 pcap_open() 。下面是参数 snaplen, flags 和 to_ms 的解释说明 pcap_t* pcap_open ( const char * source, // 指定的网卡的名称 int snaplen, // 帧的长度 int flags, // 网卡捕获的模式 int read_timeout, // 超时 struct pcap_rmtauth * auth, // 是否要求认证 char * errbuf // 错误信息存储 ) snaplen 制定要捕获数据包中的哪些部分。 在一些操作系统中 ( 比如 xBSD 和 Win32) , 驱动可以被配置成只捕获数据包的初始化部分: 这样可以减少应用程序间复制数据的量, 从而提高捕获效率。本例中,我们将值定为 65535,它比我们能遇到的最大的MTU 还要大。 因此,我们确信我们总能收到完整的数据包。 flags: 最最重要的 flag 是用来指示适配器是否要被设置成混杂模式。 一般情况下,适配 器只接收发给它自己的数据包, 而那些在其他机器之间通讯的数据包,将会被丢弃。 相 反,如果适配器是混杂模式,那么不管这个数据包是不是发给我的,我都会去捕获。也就是 说,我会去捕获所有的数据包。 这意味着在一个共享媒介( 比如总线型以太网) ,WinPcap 能捕获其他主机的所有的数据包。 大多数用于数据捕获的应用程序都会将适配器设置成混 杂模式,所以,我们也会在下面的范例中,使用混杂模式。 to_ms 指定读取数据的超时时间,以毫秒计(1s=1000ms) 。在适配器上进行读取操作( 比如 用 pcap_dispatch() 或 pcap_next_ex()) 都会在 to_ms 毫秒时间内响应,即使在网络上没有 可用的数据包。 在统计模式下,to_ms 还可以用来定义统计的时间间隔。 将 to_ms 设置 为 0 意味着没有超时,那么如果没有数据包到达的话,读操作将永远不会返回。 如果设置 成-1,则情况恰好相反,无论有没有数据包到达,读操作都会立即返回。 3.通过回调方式捕获数据的函数 程序功能:打开指定的网卡捕获数据帧,输出数据帧的捕获时间和数据帧的大小等信息。 程序运行结果如下图所示: 代码如下: //@filename: PacketCap1.cpp //程序功能:在指定的网卡上捕获数据帧,并输出数据帧的长度和捕获时间 #include pcap.h #include remote-ext.h #pragma comment(lib, wpcap) // 包处理函数 void packet_handler(u_char *param, const struc

文档评论(0)

1亿VIP精品文档

相关文档