最近想做个网络流量统计的小工具,找到一些方案。
转自:http://hi.baidu.com/gyan_katsura/item/e2e82430e15d71d51b96968e
毕设要做计算机系统数据采集监控方面的,其中有一项是监控系统上的各个网络适配器上的流量。
简单调研了一下,结果如下:
1.首先要用到的头文件和库:iphlpapi.h和iphlpapi.lib
2.直接体现网络流量的变量在MIB_IFROW结构体里,下载量保存在dwInOctets成员,上传量保存在dwOutOctets。结构体还有很多其他有用才成员变量,比如收到的Unicode包的数量等等。
3.获取网络流量,就要填充这个结构体MIB_IFROW,用到的函数是GetIfEntry(*MIB_IFROW),参数是指向MIB_IFROW结构体的指针。这个函数的用法是:首先要知道要监控的网络适配器的索引值(如何获得这个值等下再说),然后把这个值先赋给MIB_IFROW结构体的dwIndex, 然后再调用GetIfEntry进行填充,这是填充的信息就是dwIndex 对应的适配器的各种信息。
4.获得网络适配器索引值的方法:调研到两种方法,一种是用GetAdaptersInfo函数,我用的就是这种方法,这个函数用来填充一个IP_ADAPTER_INFO的结构体,不过不只填充一个,会形成一个链表结构,计算机系统上的每个网络适配器包括有线或无线的各种网卡对应一个节点,节点的Index的成员就是该网卡对应的索引值,网卡的描述可以在结构体的Describe成员中得到。用这个方法要注意第二个参数SizePointer,如果指向的值大小不足的话,函数不会填充IP_ADAPTER_INFO结构体,只是把SizePointer指向的整数值填充为所需的最小最小值,具体是多少不用管他,然后会返回ERROR_BUFFER_OVERFLOW。然后再调用一次这个函数,调用的参数和上次调用一样,这回才可以真正地填充IP_ADAPTER_INFO,所以一般要获取要用的信息这个函数要调用两次。还要注意一点,如果要再次IP_ADAPTER_INFO的话一定要把之前的链表free掉,否则会内存泄漏,这个不是由自己手动new或malloc或heapalloc出来的内存,比较容易忽略。
还有一种方法是GetIfTable函数,我没用这个方法,不知道咋用,有兴趣的自己调研一下吧^_^