理论教育 Winpcap编程实例-学习计算机网络技术

Winpcap编程实例-学习计算机网络技术

时间:2023-11-22 理论教育 版权反馈
【摘要】:假设想知道局域网中哪台计算机开着,就可以利用ARP协议和Winpcap编写一个扫描程序,对局域网内的IP网段进行扫描来判断活动主机。这是掌握ARP协议原理和熟悉Winpcap使用方法的最佳途径。全部源代码参见随书发行的“利用Winpcap和ARP扫描活动主机”中的扫描程序。

Winpcap编程实例-学习计算机网络技术

假设想知道局域网中哪台计算机开着,就可以利用ARP协议和Winpcap编写一个扫描程序,对局域网内的IP网段进行扫描来判断活动主机。下面通过这个扫描程序介绍使用Winpcap发送和接收ARP报文的方法。这是掌握ARP协议原理和熟悉Winpcap使用方法的最佳途径。全部源代码参见随书发行的“利用Winpcap和ARP扫描活动主机”中的扫描程序。

ARP报文是直接封装在MAC帧中的。ARP请求报文通过MAC帧广播出去,目的MAC地址为FF-FF-FF-FF-FF-FF的广播地址。扫描过程是按顺序逐个查询所在子网的所有IP地址对应的MAC地址,如果收到ARP响应报文,则说明目标IP地址的计算机是活动的。

下面介绍扫描程序的流程和部分代码分析。

1.定义数据结构

程序中首先将所需的库文件包含进来,并定义了核心数据结构,主要是ARP报文的首部格式和MAC帧的首部格式。

以上两个结构体分别是以太网MAC帧首部结构和ARP首部结构。在定义ARP首部结构时并没有加入填充字段,这一部分和以太帧尾部的CRC校验都可以通过硬件(网卡)自动完成,本例程序不需要处理,也就是说尽管所定义的结构体不是一个完整的MAC帧,但实际发送到网络上的却是一个完整的具有CRC校验的MAC帧。

2.程序流程

首先获得网卡的列表信息。

然后显示网卡信息,以便于用户选择所使用的网卡。

根据用户的输入选择某个网卡,并提取出网卡的地址信息。

找到用户选择的网卡结构。(www.daowen.com)

找到选中网卡的IPv4地址和子网掩码。

打开选择的网卡。

获取本地MAC地址,这部分的实现是通过自定义函数getmmac()实现的,函数getmmac()实现了一个完整的数据发送和接受过程。

过滤设置,只接收ARP数据包。

向局域网内发送ARP请求包,通过调用自定义函数SendPacket()实现。

释放资源。

开始抓包。抓包过程通过函数pcap_loop()实现,抓到包后的处理函数由自定义的回调函数packet_handler()函数实现。

以上便是程序的主要执行过程,可以看出程序的执行是按顺序先后完成,接收数据包的过程只用了一个回调函数。本例采用单线程编程而没有使用多线程的方法,在实际编程中,为了实现接收数据包时不丢包,通常采用多线程的编程方法。

使用Winpcap编写程序相对于Socket而言稍微有些复杂,因为所有的发送数据包和接收的数据包都要自己构造和解析,这样,对协议的理解就变得十分重要,通过分析协议,然后构造自己的数据帧结构,并通过接口函数进行数据的发送就是使用Winpcap编程的一般思路。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈