离场悲剧

技术类博客

Labview利用Winpcap实现以太网底层通信(二)

0
阅读(5364)

前文提要:

经过前面的那么多准备,需要的资源都已经有了,那么现在就是设计自己需要的一个程序了。我的需求很简单,通过Labview收发自定义的以太网帧数据。那么之后的设计都是为了达到这个目的,在设计的东西之前,先分析下我们前面准备的东西能达到什么状态。

3.2.1 Labview例程分析

3.2.1.1前面板功能分析

blob.png

例程的前面板如上图所示,我们可以看到它很明显得被分隔为几个部分:

1.Adapters

blob.png

很明显,这个是现在PC上的所有的网络适配器的一个显示窗口,它包含两个项:Name以及Description,这两个分别是什么呢,因为这个是通过dll文件获取到的信息,所以这部分我们就只需要知道他的作用就行了,在后续分析c++程序的时候会详细的分析下看看,实际上学渣我现在也不知道它是怎么实现的~~

可以看看我现在的电脑的网络适配器包含如下,对比一下:

blob.png

Labview的这个显示是一个多列列表框,其属性如下,原谅我的中文版blob.png

Labview的这个列表框是随你的往下拖动是可以自动增加或者减少行的,也就是增加适配器的个数,但是它的列所表示的属性,则不能随着手动拖动增加。这个属性相关的也会放到后面来分析。

2.raw data

顾名思义,这个就是来显示收到的以太网原始数据的窗口,其属性如下:blob.png

随便运行了以下程序,然后raw数据显示如下:

blob.png

当然,对以太网比较熟悉一点的就很快的知道,前面的几个是目的MAC地址和源MAC地址,因为这是一个收到的以太网帧,那么前面486个字节那肯定就是我本机的MAC地址了,事实也可以证明:

blob.png

3.以太网帧分析

前面板采用了两个主要的面板对收到的以太网帧进行分析:ethernet headerip packet

blob.png

有了这个就更清晰了,目的MAC/IP地址,源MAC/IP地址都分析出来了,具体的段信息这里就不再赘述了,详细的请参考ip协议等相关资料。

4.时间戳信息timestamp和停止按钮STOP

从上图中可以看出,面板上还包含一个包的时间信息,以及一个停止按钮,这个时间信息目前我们还不知道是什么意思,可以后续分析,这个STOP用于停止监听的按钮,按下之前,软件会一直监控选择的网络适配器上面收到的数据,而按了此按钮之后,会停止监听工作。

按钮重要的当然是它的机械动作属性了,决定了按钮的行为,从下图中可以看出此按钮的属性为释放时触发,也就是按钮松开之后会触发按钮事件:状态改变,然后等待Labview读取其值之后返回原来的状态。

blob.png

以上就是所有的前面板组件了,我们也知道了他大概的一个功能,其实主要也就是显示功能,下面将详细分析对应的Labview程序设计。

3.2.1.2程序框图设计分析

前面板只是用户接口,其实真正的程序还是在程序框图,下面就对程序框图进行分析了。

1.主程序框图

blob.png

我认为Labview的一个很大的问题就是不能用鼠标滚轮放大缩小~~从上图可以很看到主程序框图挺简单的,那么下面我们就从从左往右进行一个个分析看看。看程序框图最好的方法是把标签显示出来,因为有时候你可能不知道这个图标代表啥东西~~

blob.png

从左边到右边,第一个就是一个Initializevi,标签很明显了,是做一个初始化的东西,那么先对这个vi进行分析

2.Initialize.vi

blob.png

很简单,就是调用了一个dll里面的lvwpcap_init的初始化函数,这个函数会输出两个参数,一个是有符号的32位的数据,一个是字符串:

blob.png

参数-返回类型为有符号32位整数

参数-error-string为字符串,我猜是如果初始化函数失败的一个错误返回,这个等待后续c++程序分析的时候再进行验证吧,目前就当完全不知道这个库函数是怎么写的。

然后这两个输出经过了一个条件结构,里面如果是0的话就直接把error in连到error out,如果不是的话就是输出这个捆绑的数据了,捆绑的作用是将所有的输入元素组合成一个簇之后输出,这个输出的意义何在,为何不直接输出字符串转到簇之后直接error输出我目前还不知道,可能跟组合的元素“True”以及“返回类型”有关系吧,可以继续网口看看error_out是怎么用的。

blob.png

3.Get Interface Count.vi以及Get Interface.vi

对于这两个有明显关系的vi,这里连起来进行分析。

Get interface count程序如下:

blob.png

blob.png

它通过调用dllget_interface_count函数获取了一个count计数值,这里暂且猜测获取了PC上所有网络适配器的个数,那我们利用一个显示测试一下:

blob.png


blob.png

通过上面的显示和我们之前的截图结果对比可以知道,确实这个是拿来获取网络适配器个数的,具体方式等待后续分析。Get interface这个vi的功能如下:

blob.png

函数库调用:

blob.png

最终,以上两个VI输出一个字符串数组送到我们前面的前面板的Adapters,那其实这已经很明显了:get_interface_count获取网络适配器个数以决定后面的get_interface的循环次数,而每有一个网络适配器,则会执行一次get_interface,他们输入的变量是ii会从1加到5。然后get_interface会输出几个数据:返回类型,namedescription以及错误的string。返回类型和error_string的用法是拿来做错误处理,而namedescription则组合成一个字符串送到Adapters进行显示,最终也就是我们最开始的前面板显示的五个适配器的信息了。

4.open interface.vi

open interface的程序部分如下:

blob.png

blob.png

一般这种open的作用肯定是句柄的获取了~~。可以看到它的输入有以下几个:

a)我们前面获取到的adapter信息

b)采集size – capture_size,从输入看是65536,这个其实也就是能够获取到的以太网帧的最大长度

c)promiscuous mode的使能:这个模式直接上一段百科好了:

混杂模式(Promiscuous Mode)是指一台机器能够接收所有经过它的数据流,而不论其目的地址是否是他。是相对于通常模式(又称"非混杂模式")而言的。这被网络管理员使用来诊断网络问题,但是也被无认证的想偷听网络通信(其可能包括密码和其它敏感的信息)的人利用。一个非路由选择节点在混杂模式下一般仅能够在相同的冲突域(对以太网和无线局域网)内监控通信到和来自其它节点或环(对令牌环或FDDI),其是为什么网络交换被用于对抗恶意的混杂模式。

混杂模式就是接收所有经过网卡的数据包,包括不是发给本机的包。默认情况下网卡只把发给本机的包(包括广播包)传递给上层程序,其它的包一律丢弃。简单的讲,混杂模式就是指网卡能接受所有通过它的数据流,不管是什么格式,什么地址的。事实上,计算机收到数据包后,由网络层进行判断,确定是递交上层(传输层),还是丢弃,还是递交下层(数据链路层、MAC子层)转发。

通常在需要用到抓包工具,例如etherealsniffercapsa时,需要把网卡置于混杂模式,需要用到软件Winpcapwinpcapwindows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。

通过以上描述可以看出,混杂模式的作用还是蛮大的,假设在编写代码有错的情况下将地址设置错了,我们也可以收到并进行分析,而坏处就在于可能收到的包过多~~。在这个设计中混杂模式是处于True

d)read timeout:读超时时间,vi里面写的是100,实际主程序中送的数值是100

e)pcap dummy:这个没有引出接入端,没有送入数据h

f)pcap reference:通过创建显示组件发现他是一个常量113586560,目前还不知道是什么意思,后续分析。

5.读数据分析

在通过open_interface获取了句柄之后,那么就可以进行数据读取了。


这部分的分析应该会很大,所以等待后续篇章吧~~



Baidu
map