当前位置:文档之家› vb用Iphlpapi.dll获取网络信息教程

vb用Iphlpapi.dll获取网络信息教程

vb用Iphlpapi.dll获取网络信息第一章前言Windows 98以上的操作系统在系统目录下都带有iphlpapi.dll这个动态链接库文件,它可以帮助程序员方便地获取计算机网络信息。

对于C程序员来说,只要有iphlpapi的头文件,调用iphlpapi.dll是很简单的事,但是对于Vb程序员则是比较困难的问题。

本文将就Vb中调用iphlpapi.dll来介绍iphlpapi的使用。

第二章IPHLPAPI 的主要函数本章将根据iphlpapi.dll提供函数的功能来分别讲解iphlpapi.dll的主要函数。

编程时,我们可以调用这些函数迅速获得本机大部分网络信息。

第一节获取本机网络适配器的信息1、函数:Private Declare Function GetAdaptersInfo Lib "iphlpapi.dll" ( IpAdapterInfo As Any, pOutBufLen As Long) As Long参数说明:pAdapterInfo:[输出] 指向一个IP_ADAPTER_INFO类型的连接表;pOutBufLen:[输入] 指定pAdapterInfo参数的大小,如果指定大小不足,GetAdaptersInfo 将此参数置为所需大小, 并返回一个ERROR_BUFFER_OVERFLOW错误代码。

返回值:成功,返回0;失败,返回错误代码。

备注:此函数不能获得回环(Loopback)适配器的信息2、使用到的类型:①IP_ADAPTER_INFO类型:包含本机网络适配器信息。

Type IP_ADAPTER_INFONext As Long ‘在适配器列表中指向下一个适配器ComboIndex As Long ‘保留未用AdapterName As String * MAX_ADAPTER_NAME_LENGTH ‘适配器名Description As String * MAX_ADAPTER_DESCRIPTION_LENGTH ‘对网卡的描述,‘实际上好象是驱动程序的名字AddressLength As Long ‘适配器物理地址的长度Address(MAX_ADAPTER_ADDRESS_LENGTH - 1) As Byte‘物理地址,每个字节存放一个十六进制的数值Index As Long ‘适配器索引号Type As Long ‘适配器类型,包含以下类型的适配器(见下表):常量名称值说明MIB_IF_TYPE_ETHERNET 6 以太网适配器MIB_IF_TYPE_TOKENRING 9 令牌环适配器MIB_IF_TYPE_FDDI 15 光纤接口适配器MIB_IF_TYPE_PPP 23 点到点协议适配器MIB_IF_TYPE_LOOPBACK 24 回环(Loopback)适配器MIB_IF_TYPE_SLIP 28 串行适配器MIB_IF_TYPE_OTHER 其他值其他类型的适配器DhcpEnabled As Long ‘适配器是否启用了动态主机配置协议(DHCP)CurrentIpAddress As Long ‘保留(当前使用的IP地址?)IpAddressList As IP_ADDR_STRING ‘绑定到此适配器的IP地址链表GatewayList As IP_ADDR_STRING ‘默认网关地址链表DhcpServer As IP_ADDR_STRING ‘DHCP服务器地址,DhcpEnabled=TRUE时有效HaveWins As Byte ‘是否启用WINS(Windows Internet Name Service)PrimaryWinsServer As IP_ADDR_STRING ‘主WINS地址SecondaryWinsServer As IP_ADDR_STRING ‘辅WINS地址LeaseObtained As Long ‘向DHCP服务器租用IP地址的时间,DhcpEnabled=TRUE时有效LeaseExpires As Long ‘向DHCP服务器租用IP地址到期时间,DhcpEnabled=TRUE时有效End Type②IP_ADDR_STRING描述IP 地址链表的节点。

Type IP_ADDR_STRINGNext As Long ‘指向列表中下一个IP_ADDR_STRING类型。

为空,则是最后一个地址IpAddress As String * 16 ‘点式十进制字串表示Ip地址IpMask As String * 16 ‘子网掩码Context As Long ‘网络IP地址标识,符合AddIPAddress和DeleteIPAddress函数中的网‘接口关联参数。

End Type3、使用到的常量:Const MAX_ADAPTER_NAME_LENGTH = 260 //适配器名字长度Const MAX_ADAPTER_ADDRESS_LENGTH = 8 //适配器物理地址长度Const MAX_ADAPTER_DESCRIPTION_LENGTH = 132 //适配器描述长度4、主要代码分析:①调用函数GetAdaptersInfo,以及在调用中应该注意的问题:对函数GetAdaptersInfo进行两次调用,第一次调用获得参数pOutBufLen的实际大小;第二次调用获取IpAdapterInfo的数据。

代码如下:pOutBufLen = 0error = GetAdaptersInfo(ByVal 0&, pOutBufLen)ReDim AdapterInfoBuffer(pOutBufLen - 1)error = GetAdaptersInfo(AdapterInfoBuffer(0), pOutBufLen)②IpAdapterInfo中可能包含多个IP_ADAPTER_INFO类型,因此下一步使用copymemory函数将数据拷贝到IP_ADAPTER_INFO类型:CopyMemory AdapterInfo, AdapterInfoBuffer(0), pOutBufLen③获得了首个IP_ADAPTER_INFO类型后,根据IP_ADAPTER_INFO类型中的Next成员并调用循环语句(Do…Loop Until)来获得所有IP_ADAPTER_INFO类型:DopAdapt = AdapterInfo.NextIf pAdapt <> 0 ThenCopyMemory AdapterInfo, ByVal pAdapt, AdapterInfoSizeEnd IfLoop Until pAdapt = 0④由每次获得的IP_ADAPTER_INFO类型来获取网络适配器物理地址:PhysicalAddress = ""For i = 0 To AdapterInfo.AddressLength - 1PhysicalAddress = PhysicalAddress & Hex(AdapterInfo.Address(i))If i < AdapterInfo.AddressLength - 1 ThenPhysicalAddress = PhysicalAddress & "-"End IfNext⑤对于属于IP_ADDR_STRING类型的IpAddressList、GatewayList、DhcpServer、PrimaryWinsServer、SecondaryWinsServer,同样要注意IP_ADDR_STRING中Next成员的使用:DoCopyMemory IP_ADDR_STRING, AdapterInfo.IpAddressList, LenB(IP_ADDR_STRING)Print "IP Address: " & IP_ADDR_STRING.IpAddressPrint "Subnet Mask: " & IP_ADDR_STRING.IpMaskpAddrStr = IP_ADDR_STRING.NextIf pAddrStr <> 0 ThenCopyMemory IP_ADDR_STRING.IpAddressList, ByVal pAddrStr, _LenB(IP_ADDR_STRING.IpAddressList)End IfLoop Until pAddrStr = 05、运行时截图:第二节获取MIB-II 接口表1、函数:Private Declare Function GetIfTable Lib "iphlpapi.dll" (ByRef pIfTable As MIB_IFTABLE, ByRef pdwSize As Long, ByVal bOrder As Long) As Long参数说明:pIfTable:[输入]成功的话指向一个MIB_IFTABLE类型的缓冲区。

PdwSize:[输入,输出]指定pIfTable参数所占缓冲区的大小,如果缓冲区不是足够大返回接口表,函数设置这个参数等于所必须的缓冲区大小。

bOrder:[输入]指定返回的接口表是否按接口序号按上升顺序排列。

如果参数为TRUE那么按上升顺序排列。

返回值:成功,返回0;失败,返回错误代码。

2、使用到的类型:①MIB_IFTABLE 包含接口表Private Type MIB_IFTABLEdwNumEntries As Long '当前网络接口的总数MIB_Table(9) As MIB_IFROW '指向一个包含MIB_IFROW类型的指针End Type②MIB_IFROW 保存接口信息Private Type MIB_IFROWwszName(0 To 511) As Byte '接口名称的Unicode字符串,必须为512字节dwIndex As Long '接口编号dwType As Long '接口类型,参看IP_ADAPTER_INFO类型的Type成员dwMtu As Long '最大传输单元dwSpeed As Long '接口速度(字节)dwPhysAddrLen As Long '由bPhysAddr获得的物理地址有效长度bPhysAddr(0 To 7) As Byte '物理地址dwAdminStatus As Long '接口管理状态dwOperStatus As Long '操作状态,以下值之一:常量名称值说明MIB_IF_OPER_STA TUS_NON_OPERATIONAL 0 网络适配器被禁止,例如:地址冲突MIB_IF_OPER_STA TUS_UNREACHABLE 1 没有连接MIB_IF_OPER_STA TUS_DISCONNECTED 2 局域网:电缆未连接;广域网:无载波信号MIB_IF_OPER_STA TUS_CONNECTING 3 广域网适配器连接中MIB_IF_OPER_STA TUS_CONNECTED 4 广域网适配器连接上远程对等点MIB_IF_OPER_STA TUS_OPERA TIONAL 5 局域网适配器默认状态dwLastChange As Long '操作状态最后改变的时间dwInOctets As Long '总共收到(字节)dwInUcastPkts As Long '总共收到(unicast包)dwInNUcastPkts As Long '总共收到(non-unicast包),包括广播包和多点传送包dwInDiscards As Long '收到后丢弃包总数(即使没有错误)dwInErrors As Long '收到出错包总数dwInUnknownProtos As Long '收到后因协议不明而丢弃的包总数dwOutOctets As Long '总共发送(字节)dwOutUcastPkts As Long '总共发送(unicast包)dwOutNUcastPkts As Long '总共发送(non-unicast包),包括广播包和多点传送包dwOutDiscards As Long '发送丢弃包总数(即使没有错误)dwOutErrors As Long '发送出错包总数dwOutQLen As Long '发送队列长度dwDescrLen As Long ' bDescr部分有效长度bDescr(0 To 255) As Byte '接口描述End Type3、使用到的常量:无4、主要代码分析:①分配足够大的缓存空间,然后直接调用GetIfTable获得接口信息:Dim ifT As MIB_IFTABLELenIfT = Len(ifT)RValue = GetIfTable(ifT, LenIfT, True)②由ifT.dwNumEntries获得接口数量,然后用for…next循环获取每个接口信息:For i = 0 To ifT.dwNumEntries - 1Print "接口编号:" & ifT.MIB_Table(i).dwIndexPrint "接口速度:" & ifT.MIB_Table(i).dwSpeedNext③物理地址的获得:PhysAddr = Right("00" & Hex(ifT.MIB_Table(i).bPhysAddr(0)), 2)For j = 1 To 5PhysAddr = PhysAddr & "-" & Right("00" & Hex(ifT.MIB_Table(i).bPhysAddr(j)), 2)NextPrint "物理地址:" & PhysAddr5、运行时截图:第三节获取本机TCP 信息列表1、函数:Private Declare Function GetTcpStatistics Lib "iphlpapi.dll" (ByRef pTcpStats As MIB_TCPSTATS) As Long参数说明:pStats :[输出]指向一个接收本机TCP统计表的MIB_TCPSTA TS类型返回值:成功,返回0;失败,返回错误代码。

相关主题