Labview利用Winpcap实现以太网底层通信(二)
0赞前文提要:
经过前面的那么多准备,需要的资源都已经有了,那么现在就是设计自己需要的一个程序了。我的需求很简单,通过Labview收发自定义的以太网帧数据。那么之后的设计都是为了达到这个目的,在设计的东西之前,先分析下我们前面准备的东西能达到什么状态。
3.2.1 Labview例程分析
3.2.1.1前面板功能分析
例程的前面板如上图所示,我们可以看到它很明显得被分隔为几个部分:
1.Adapters
很明显,这个是现在PC上的所有的网络适配器的一个显示窗口,它包含两个项:Name以及Description,这两个分别是什么呢,因为这个是通过dll文件获取到的信息,所以这部分我们就只需要知道他的作用就行了,在后续分析c++程序的时候会详细的分析下看看,实际上学渣我现在也不知道它是怎么实现的~~
可以看看我现在的电脑的网络适配器包含如下,对比一下:
Labview的这个显示是一个多列列表框,其属性如下,原谅我的中文版:
Labview的这个列表框是随你的往下拖动是可以自动增加或者减少行的,也就是增加适配器的个数,但是它的列所表示的属性,则不能随着手动拖动增加。这个属性相关的也会放到后面来分析。
2.raw data
顾名思义,这个就是来显示收到的以太网原始数据的窗口,其属性如下:
随便运行了以下程序,然后raw数据显示如下:
当然,对以太网比较熟悉一点的就很快的知道,前面的几个是目的MAC地址和源MAC地址,因为这是一个收到的以太网帧,那么前面48位6个字节那肯定就是我本机的MAC地址了,事实也可以证明:
3.以太网帧分析
前面板采用了两个主要的面板对收到的以太网帧进行分析:ethernet header和ip packet:
有了这个就更清晰了,目的MAC/IP地址,源MAC/IP地址都分析出来了,具体的段信息这里就不再赘述了,详细的请参考ip协议等相关资料。
4.时间戳信息timestamp和停止按钮STOP
从上图中可以看出,面板上还包含一个包的时间信息,以及一个停止按钮,这个时间信息目前我们还不知道是什么意思,可以后续分析,这个STOP用于停止监听的按钮,按下之前,软件会一直监控选择的网络适配器上面收到的数据,而按了此按钮之后,会停止监听工作。
按钮重要的当然是它的机械动作属性了,决定了按钮的行为,从下图中可以看出此按钮的属性为释放时触发,也就是按钮松开之后会触发按钮事件:状态改变,然后等待Labview读取其值之后返回原来的状态。
以上就是所有的前面板组件了,我们也知道了他大概的一个功能,其实主要也就是显示功能,下面将详细分析对应的Labview程序设计。
3.2.1.2程序框图设计分析
前面板只是用户接口,其实真正的程序还是在程序框图,下面就对程序框图进行分析了。
1.主程序框图
我认为Labview的一个很大的问题就是不能用鼠标滚轮放大缩小~~从上图可以很看到主程序框图挺简单的,那么下面我们就从从左往右进行一个个分析看看。看程序框图最好的方法是把标签显示出来,因为有时候你可能不知道这个图标代表啥东西~~
从左边到右边,第一个就是一个Initialize的vi,标签很明显了,是做一个初始化的东西,那么先对这个vi进行分析
2.Initialize.vi
很简单,就是调用了一个dll里面的lvwpcap_init的初始化函数,这个函数会输出两个参数,一个是有符号的32位的数据,一个是字符串:
参数-返回类型为有符号32位整数
参数-error-string为字符串,我猜是如果初始化函数失败的一个错误返回,这个等待后续c++程序分析的时候再进行验证吧,目前就当完全不知道这个库函数是怎么写的。
然后这两个输出经过了一个条件结构,里面如果是0的话就直接把error in连到error out,如果不是的话就是输出这个捆绑的数据了,捆绑的作用是将所有的输入元素组合成一个簇之后输出,这个输出的意义何在,为何不直接输出字符串转到簇之后直接error输出我目前还不知道,可能跟组合的元素“True”以及“返回类型”有关系吧,可以继续网口看看error_out是怎么用的。
3.Get Interface Count.vi以及Get Interface.vi
对于这两个有明显关系的vi,这里连起来进行分析。
Get interface count程序如下:
它通过调用dll的get_interface_count函数获取了一个count计数值,这里暂且猜测获取了PC上所有网络适配器的个数,那我们利用一个显示测试一下:
通过上面的显示和我们之前的截图结果对比可以知道,确实这个是拿来获取网络适配器个数的,具体方式等待后续分析。而Get interface这个vi的功能如下:
函数库调用:
最终,以上两个VI输出一个字符串数组送到我们前面的前面板的Adapters,那其实这已经很明显了:get_interface_count获取网络适配器个数以决定后面的get_interface的循环次数,而每有一个网络适配器,则会执行一次get_interface,他们输入的变量是i,i会从1加到5。然后get_interface会输出几个数据:返回类型,name、description以及错误的string。返回类型和error_string的用法是拿来做错误处理,而name和description则组合成一个字符串送到Adapters进行显示,最终也就是我们最开始的前面板显示的五个适配器的信息了。
4.open interface.vi
open interface的程序部分如下:
一般这种open的作用肯定是句柄的获取了~~。可以看到它的输入有以下几个:
a)我们前面获取到的adapter信息
b)采集size – capture_size,从输入看是65536,这个其实也就是能够获取到的以太网帧的最大长度
c)promiscuous mode的使能:这个模式直接上一段百科好了:
混杂模式(Promiscuous Mode)是指一台机器能够接收所有经过它的数据流,而不论其目的地址是否是他。是相对于通常模式(又称"非混杂模式")而言的。这被网络管理员使用来诊断网络问题,但是也被无认证的想偷听网络通信(其可能包括密码和其它敏感的信息)的人利用。一个非路由选择节点在混杂模式下一般仅能够在相同的冲突域(对以太网和无线局域网)内监控通信到和来自其它节点或环(对令牌环或FDDI),其是为什么网络交换被用于对抗恶意的混杂模式。
混杂模式就是接收所有经过网卡的数据包,包括不是发给本机的包。默认情况下网卡只把发给本机的包(包括广播包)传递给上层程序,其它的包一律丢弃。简单的讲,混杂模式就是指网卡能接受所有通过它的数据流,不管是什么格式,什么地址的。事实上,计算机收到数据包后,由网络层进行判断,确定是递交上层(传输层),还是丢弃,还是递交下层(数据链路层、MAC子层)转发。
通常在需要用到抓包工具,例如ethereal、sniffer、capsa时,需要把网卡置于混杂模式,需要用到软件Winpcap。winpcap是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
通过以上描述可以看出,混杂模式的作用还是蛮大的,假设在编写代码有错的情况下将地址设置错了,我们也可以收到并进行分析,而坏处就在于可能收到的包过多~~。在这个设计中混杂模式是处于True。
d)read timeout:读超时时间,vi里面写的是100,实际主程序中送的数值是100
e)pcap dummy:这个没有引出接入端,没有送入数据h
f)pcap reference:通过创建显示组件发现他是一个常量113586560,目前还不知道是什么意思,后续分析。
5.读数据分析
在通过open_interface获取了句柄之后,那么就可以进行数据读取了。
这部分的分析应该会很大,所以等待后续篇章吧~~