在vb中使用Iphlpapidll获取网络信息_第1页
在vb中使用Iphlpapidll获取网络信息_第2页
在vb中使用Iphlpapidll获取网络信息_第3页
在vb中使用Iphlpapidll获取网络信息_第4页
在vb中使用Iphlpapidll获取网络信息_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在 vb 中使用 Iphlpapi.dll 获取网络信息第一章 前言Windows 98 以上的操作系统在系统目录下都带有 iphlpapi.dll 这个动态库文件,它可以 帮助程序员方便地获取计算机网络信息。 对于 C 程序员来说, 只要有 iphlpapi 的头文件, 调 用 iphlpapi.dll 是很简单的事,但是对于 Vb 程序员则是比较困难的问题。本文将就 Vb 中调 用 iphlpapi.dll 来介绍 iphlpapi 的使用。第二章 IPHLPAPI 的主要函数本章将根据 iphlpapi.dll 提供函数的功能来分别讲解 iphlpapi.dll 的主要函数。编程时, 我

2、们可以调用这些函数迅速获得本机大部分网络信息。第一节 获取本机网络适配器的信息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_OV

3、ERFLOW 错误代码。返回值:成功,返回 0;失败,返回错误代码。备注:此函数不能获得回环( Loopback )适配器的信息2、使用到的类型: IP_ADAPTER_INFO 类型:包含本机网络适配器信息。Type IP_ADAPTER_INFONext As Long 在适配器列表中指向下一个适配器适配器名ComboIndex As Long保留未用AdapterName As String * MAX_ADAPTER_NAME_LENGTHDescription As String * MAX_ADAPTER_DESCRIPTION_LENGTH对网卡的描述,实际上好象是驱动程序的名字

4、AddressLength As Long 适配器物理地址的长度Address(MAX_ADAPTER_ADDRESS_LENGTH - 1) As Byte物理地址, 每个字节存放一个十六进制的数值Index As Long适配器索引号Type As Long适配器类型,包含以下类型的适配器(见下表) :常量名称值说明MIB_IF_TYPE_ETHERNET6以太网适配器MIB_IF_TYPE_TOKENRING9令牌环适配器MIB_IF_TYPE_FDDI15光纤接口适配器MIB_IF_TYPE_PPP23点到点协议适配器MIB_IF_TYPE_LOOPBACK24回环( Loopback

5、 )适配器MIB_IF_TYPE_SLIP28串行适配器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_STRINGDHCP 服务器地址, DhcpEnabled=TRUE 时有效HaveWins As B

6、yte是否启用 WINS ( Windows Internet Name Service )辅 WINS 地址PrimaryWinsServer As IP_ADDR_STRING 主 WINS 地址SecondaryWinsServer As IP_ADDR_STRINGLeaseObtained As Long 向 DHCP 服务器租用 IP 地址的时间, DhcpEnabled=TRUE 时有 效LeaseExpires As Long 向 DHCP 服务器租用 IP 地址到期时间, DhcpEnabled=TRUE 时有效End Type IP_ADDR_STRING 描述 IP 地址

7、链表的节点。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

8、_LENGTH = 8/适配器物理地址长度Const MAX_ADAPTER_DESCRIPTION_LENGTH = 132/适配器描述长度4、主要代码分析: 调用函数 GetAdaptersInfo ,以及在调用中应该注意的问题:对函数 GetAdaptersInfo 进行 两次调用, 第一次调用获得参数 pOutBufLen 的实际大小; 第二次调用获取 IpAdapterInfo 的 数据。代码如下:pOutBufLen = 0error = GetAdaptersInfo(ByVal 0&, pOutBufLen)ReDim AdapterInfoBuffer(pOutBufLen

9、- 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 成员 并调用循环语句 (DoLoop Until) 来获得所有 IP_AD

10、APTER_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

11、 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_S

12、TRING)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、函数:Priva

13、te 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 那么按上升

14、顺序排列。返回值:成功,返回 0;失败,返回错误代码。2、使用到的类型:MIB_IFTABLE 包含接口表Private Type MIB_IFTABLEdwNumEntries As Long当前网络接口的总数MIB_Table(9) As MIB_IFROW指向一个包含 MIB_IFROW 类型的指针End TypeMIB_IFROW 保存接口信息Private Type MIB_IFROWwszName(0 To 511) As Byte 接口名称的 Unicode 字符串,必须为 512 字节dwIndex As Long接口编号dwType As Long接口类型,参看 IP_ADA

15、PTER_INFO 类型的 Type 成员dwMtu As Long最大传输单元dwSpeed As Long接口速度(字节)dwPhysAddrLen As Long由 bPhysAddr 获得的物理地址有效长度bPhysAddr(0 To 7) As Byte 物理地址dwAdminStatus As Long接口管理状态dwOperStatus As Long操作状态,以下值之一:网络适配器被禁止, 例如: 地址冲突常量名称 值 说明1 没有连接MIB_IF_OPER_STA TUS_NON_OPERATIONAL 0MIB_IF_OPER_STA TUS_UNREACHABLEMIB_

16、IF_OPER_STA TUS_DISCONNECTED2 局域网:电缆未连接;广域网:无载波信号广域网适配器连接中广域网适配器连接上远程对等点局域网适配器默认状态MIB_IF_OPER_STA TUS_CONNECTING3MIB_IF_OPER_STA TUS_CONNECTED4MIB_IF_OPER_STA TUS_OPERA TIONAL5dwLastChange As Long操作状态最后改变的时间dwInOctets As Long总共收到 (字节 )dwInUcastPkts As Long总共收到 (unicast 包 )dwInNUcastPkts As Long总共收到

17、(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发送丢弃包总数(即使没有错误)dwOutErro

18、rs 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 =

19、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、运行时截图:第三节 获

20、取本机 TCP 信息列表1、函数:AsPrivate Declare Function GetTcpStatistics Lib iphlpapi.dll (ByRef pTcpStats MIB_TCPSTATS) As Long参数说明:pStats :输出 指向一个接收本机TCP 统计表的 MIB_TCPSTA TS 类型返回值:成功,返回 0;失败,返回错误代码。2、使用到的类型: MIB_TCPSTATS 包含本机上正运行的 TCP 协议的统计表Type MIB_TCPSTATSdwRtoAlgorithm As Long 指定重传输 (RTO: retransmission tim

21、e-out) 算法dwRtoMin As Long重传输超时的最小值,毫秒dwRtoMax As Long重传输超时的最大值,毫秒dwMaxConn As Long连接最大数目,如果为 -1,则连接的最大数目是可变的dwActiveOpens As Long主动连接数目,即客户端正向服务器进行连接数目dwPassiveOpens As Long被动连接数目,即服务器监听连接客户端请求数目dwAttemptFails As Long尝试连接失败的次数dwEstabResets As Long对已建立的连接实行重设的次数dwCurrEstab As Long目前已建立的连接dwInSegs As

22、Long收到分段数据报的数目dwOutSegs As Long传输的分段数据报数目,不包括转发的数据包dwRetransSegs As Long转发的分段数据报数目dwInErrs As Long收到错误的数目dwOutRsts As Long重设标志设定后传输分段数据报数目dwNumConns As Long累计连接的总数End Type3、使用到的常量:无4、主要代码分析: 定义一个 MIB_TCPSTA TS 类型变量,然后直接调用 GetTcpStatistics :Dim mTcpS As MIB_TCPSTA TSRValue = GetTcpStatistics(mTcpS)5、

23、运行时截图:第四节 获取当前 TCP 连接情况1、函数:Private Declare Function GetTcpTable Lib iphlpapi.dll (ByRef pTcpTable As MIB_TCPTABLE, ByRef pdwSize As Long, ByVal bOrder As Long) As Long参数说明:pTcpTable: 输入 指向包含了 MIB_TCPTABLE 类型的 TCP 连接表。pdwSize: 输入,输出 指向 pTcpTable 参数的缓冲区大小,如果分配的缓冲不够,那么就等 于最小需要缓冲。bOrder:输入指定连接表是否按照类型排列

24、。 TRUE ,那么就按以下类型顺序排列: Local IP address, Local port , Remote IP address, Remote port。返回值:成功,返回 0;失败,返回错误代码。2、使用到的类型: MIB_TCPTABLE 类型包含 Tcp 连接表。Type MIB_TCPTABLEdwNum_Of_Entries As Long 当前包含 MIB_TCPROW 类型的总数TCP_Table() As MIB_TCPROW 指向包含 MIB_TCPROW 类型的指针End Type备注:实际使用中可以定义: TCP_Table(120) As MIB_TCPR

25、OW 预留足够缓存 MIB_TCPROW 类型包含了 TCP 连接信息。Type MIB_TCPROWdwState As Long TCP 连接状态,为以下值之一:值说明1关闭2正在监听3同步发送4同步接收5已建立6FINWAIT 17FINWAIT 28关闭等待9正在关闭MIB_TCP_STA TE_CLOSING最后一次确认常量名称MIB_TCP_STA TE_CLOSEDMIB_TCP_STA TE_LISTENMIB_TCP_STA TE_SYN_SENTMIB_TCP_STA TE_SYN_RCVDMIB_TCP_STA TE_ESTABMIB_TCP_STA TE_FIN_WAI

26、T1MIB_TCP_STA TE_FIN_WAIT2MIB_TCP_STA TE_CLOSE_W AITMIB_TCP_STA TE_LAST_ACK 10MIB_TCP_STA TE_TIME_W AIT 11时间等待删除连接MIB_TCP_STA TE_DELETE_TCB 12dwLocalAddr As Long本地 IPdwLocalPort As Long本地端口dwRemoteAddr As Long远程机器 IPdwRemotePort As Long远程机器端口End Type3、使用到的常量:无4、主要代码分析: 定义一个 MIB_TCPTABLE 类型的变量, 因为我们在

27、定义 MIB_TCPTABLE 类型的时候预 留了足够的缓存 ( TCP_Table(120) As MIB_TCPROW ) ,因此获得定义变量的大小后直接调用 GetTcpTable,但是要注意的是,实际获得的 TCP 连接的总数应为 dwNum_Of_Entries 的值, 一般小于我们的定义( 120):Dim mtcp As MIB_TCPTABLEmtcplen = Len(mtcp)rvalue = GetTcpTable(mtcp, mtcplen, True)使用 ForNext 循环遍历各个 Tcp 连接的信息:For i = 0 To mtcp.dwNum_Of_Entr

28、ies - 1Print mtcp.TCP_Table(i).dwLocalAddr & - & mtcp.TCP_Table(i).dwRemoteAddrNext 因为 MIB_TCPROW 类型中 dwLocalAddr 、dwRemoteAddr 均为一长整型数,因此要通过 转换来获得 IP 地址:Dim Ip_Buf(1 To 4) As ByteCopyMemory Ip_Buf(1), dwLocalAddr, 4GetIp = CStr(Ip_Buf(1) + . + CStr(Ip_Buf(2) + . + CStr(Ip_Buf(3) + . + CStr(Ip_Buf(4

29、) 因为 MIB_TCPROW 类型中 dwLocalPort 、dwRemotePort 均为一长整型数, 因此要通过转 换来获得端口:GetPort = dwLocalPort/ 256 + (dwLocalPort Mod 256) * 2565、运行时截图:第五节 获取本机 UDP 信息列表1、函数:Private Declare Function GetUdpStatistics Lib iphlpapi.dll (pStats As MIB_UDPSTATS) As Long参数说明:pStats: 输出指向一个接收到本机 UDP 统计表的 MIB_UDPSTA TS 类型返回值:

30、成功,返回 0;失败,返回错误代码。2、使用到的类型:MIB_UDPSTATS 包含 UDP (User Datagram Protocol) 运行信息Type MIB_UDPSTATSdwInDatagrams As Long已收到数据报数目dwNoPorts As Long因为端口号有误而丢弃的数据报数目dwInErrors As Long已收到多少错误数据报,不包括dwNoPorts 中统计的数目dwOutDatagrams As Long已传输数据报数目dwNumAddrs As LongUDP 监听者表中接口数目End Type3、使用到的常量:无4、主要代码分析:定义一个 MIB_

31、UDPSTA TS 类型的变量,然后直接使用 GetUdpStatistics 函数即可:Dim Mudp As MIB_UDPSTATS r = GetUdpStatistics(Mudp)5、运行时截图:第六节 获取当前 UDP 连接情况1、函数:Private Declare Function GetUdpTable Lib iphlpapi.dll (ByRef pTcpTable As MIB_UDPTABLE, ByRef pdwSize As Long, ByVal bOrder As Long) As Long参数说明:pUdpTable: 输出 指向一个缓存作为 MIB_UD

32、PTABLE 类型用来接收 UDP 监听表。pdwSize:输入或输出 输入,指定 pUdpTable 参数所占缓存大小; 输出, 如果指定的缓存大 小不足,将设置为所须的大小。bOrder:输入指定返回的表是否按分类排列。 如果为 TRUE ,按以下分类排列: 1、IP 地址;2、端口。返回值:成功,返回 0;失败,返回错误代码。2、使用到的类型: MIB_UDPTABLE 包含 MIB_UDPROW 类型Type MIB_UDPTABLEdwNum_Of_Entries As Long当前 UDP 连接的总数UDP_Table() As MIB_UDPROW指向包含 MIB_UDPROW

33、类型的指针预留足够缓存End Type备注:实际使用中可以定义: UDP_Table(120) As MIB_UDPROW MIB_UDPROW 包含发送和接收UDP 数据包的地址信息。它的格式如下:Type MIB_UDPROWdwLocalAddr As Long 本地 IPdwLocalPort As Long本地端口End Type3、使用到的常量:4、主要代码分析: 定义一个 MIB_TCPTABLE 类型的变量, 因为我们在定义 MIB_TCPTABLE 类型的时候预 留了足够的缓存 ( TCP_Table(120) As MIB_TCPROW ) ,因此获得定义变量的大小后直接调

34、用 GetTcpTable。但是要注意的是,实际获得的 UDP 连接的总数应为 dwNum_Of_Entries 的值, 一般小于我们的定义( 120):Dim Mudp As MIB_UDPTABLEmudplen = Len(Mudp)rvalue = GetUdpTable(Mudp, mudplen, True) 使用 ForNext 循环遍历各个 Tcp 连接的信息:For i = 0 To Mudp.dwNum_Of_Entries - 1Print Mudp.UDP_Table(i).dwLocalAddr & : & Mudp.UDP_Table(i).dwLocalPortN

35、ext 因为 MIB_UDPTABLE 类型中 dwLocalAddr 为一长整型数, 因此要通过转换来获得 IP 地 址:Dim Ip_Buf(1 To 4) As ByteCopyMemory Ip_Buf(1), dwLocalAddr, 4GetIp = CStr(Ip_Buf(1) + . + CStr(Ip_Buf(2) + . + CStr(Ip_Buf(3) + . + CStr(Ip_Buf(4) 因为 MIB_UDPTABLE 类型中 dwLocalPort 为一长整型数,因此要通过转换来获得端口:GetPort = dwLocalPort/ 256 + (dwLocalP

36、ort Mod 256) * 2565、运行时截图:第七节 获取本机网间控制报文协议( ICMP : Internet Control Message Protocol )信息1、函数:Private Declare Function GetIcmpStatistics Lib iphlpapi.dll (pStats As MIB_ICMP) As Long 参数说明:pStats:输出 指向一个本机收到 ICMP 统计表的 MIB_ICMP 类型。 返回值:成功,返回 0;失败,返回错误代码。2、使用到的类型: MIB_ICMP 为特殊适配器包含网间控制报文协议(ICMP : Intern

37、et Control MessageProtocol )统计表。Public Type MIB_ICMPstats As MIBICMPINFO 指定 MIBICMPINFO 类型包含了电脑 ICMP 统计信息表End TypeMIBICMPINFO 通过 MIBICMPSTA TS 结构存储的接收或发出的 ICMP 信息。Public Type MIBICMPINFOicmpInStats As MIBICMPSTA TS 指向 MIBICMPSTA TS 类型,包含接收数据icmpOutStats As MIBICMPSTATS 指向 MIBICMPSTA TS 类型,包含发出数据End

38、Type MIBICMPSTATS 包含 ICMP (Internet Control Message Protocol) 接收或发出的统计信息。Public Type MIBICMPSTATSdwMsgs As Long已收发多少消息dwDestUnreachs As Long已收发多少 目标不可抵达 消息dwTimeExcds As Long已收发多少生存期已过消息dwParmProbs As Long已收发多少表明数据报有错误 IP 信息的消息dwSrcQuenchs As Long已收发多少源结束消息dwRedirects As Long已收发多少重定向消息dwEchos As Lon

39、g已收发多少 ICMP 响应请求dwEchoReps As Long已收发多少 ICMP 响应应答dwTimestamps As Long已收发多少时间戳请求dwTimestampReps As Long已收发多少时间戳响应dwAddrMasks As Long已收发多少地址掩码dwAddrMaskReps As Long 已收发多少地址掩码响应dwErrors As Long已收发多少错误End Type3、使用到的常量:无4、主要代码分析:定义一个 MIB_ICMP 类型的变量,然后直接调用 GetIcmpStatistics :Dim Micmp As MIB_ICMP r = GetI

40、cmpStatistics(Micmp)使用 Micmp.stats.icmpInStats 成员获取收到的数据信息;使用 Micmp.stats.icmpOutStats 成员获取发送的数据信息。5、运行时截图:第八节 获取本机网络参数1、函数:Private Declare Function GetNetworkParams Lib IPHlpApi.dll (FixedInfo As Any, pOutBufLenAs Long) As Long参数说明:pFixedInfo : 输出 指向一个接收本机网络参数的数据块。pOutBufLen : 输入,输出 指向一个 ULONG 变量,改

41、变量指定了 FixedInfo 参数的大小。 如果指定的大小不够大, 将设置为须要的大小并返回 ERROR_BUFFER_OVERFLOW 错误。返回值:成功,返回 0;失败,返回错误代码。2、使用到的类型:IP_ADDR_STRING 描述 IP 地址链表的节点。见 第二章 第一节 2 FIXED_INFO 包含电脑网络参数信息Type FIXED_INFOHostName As String * MAX_HOSTNAME_LEN本机名CurrentDnsServer As Long 址DomainName As String * MAX_DOMAIN_NAME_LEN本机 DNS 域保留,

42、使用 DnsServerList 获取 DNS 服务器的 IP 地DnsServerList As IP_ADDR_STRING 本机采用的 DNS 服务器链表节点类型,以下值:NodeType As Long1 BROADCAST_NODETYPE2 PEER_TO_PEER_NODETYPE4 MIXED_NODETYPE8 HYBRID_NODETYPEElseScopeId As String * MAX_SCOPE_ID_LENEnableRouting As LongEnableProxy As LongEnableDns As LongIP 广播, b 节点 NetBIOS 名字

43、解析法 点到点通信, p 节点名字解析 Mixed , m 节点 NetBIOS 名字解析法Hybrid ,h节点 NetBIOS 名字解析法 未知节点类型DHCP 围名字本机能否路由本机能否作为地址解析协议(本机能否 DNS 查询ARP )代理End Type备注:此类型在 vb中和 c中的定义有所不同,详情请参看 MSDN 。3、使用到的常量:Const MAX_HOSTNAME_LEN = 132Const MAX_DOMAIN_NAME_LEN = 132Const MAX_SCOPE_ID_LEN = 2604、主要代码分析: 由于 IP_ADDR_STRING 的实际大小未知,我们

44、不能直接获取其大小,所以首先对函数 GetNetworkParams 进行两次调用,第一次调用获得参数 pOutBufLen 的实际大小;第二次调 用获取 FixedInfoBuffer(0) 的数据。代码如下:Dim FixedInfoBuffer() As ByteFixedInfoSize = 0rvalue = GetNetworkParams(ByVal 0, FixedInfoSize)ReDim FixedInfoBuffer(FixedInfoSize - 1)rvalue = GetNetworkParams(FixedInfoBuffer(0), FixedInfoSize

45、) 使用 copymemory 函数将数据拷贝到 FixedInfo 中,然后就可以使用CopyMemory FixedInfo, FixedInfoBuffer(0), FixedInfoSizePrint Host Name, FixedInfo.HostName 采用 Do 循环来获取所有 DNS 服务器地址:Print DnsServer IP, FixedInfo.DnsServerList.IpAddress pAddrStr = FixedInfo.DnsServerList.NextDo While pAddrStr 0CopyMemory IPAS, ByVal pAddrS

46、tr, LenB(IPAS)Print DNSServer IP, IPAS.IpAddresspAddrStr = IPAS.NextLoop5、运行时截图:第九节 获取网卡 IP 地址映射表1、函数:FIXED_INFO 结构了:(pIpAddrTable AsPrivate Declare Function GetIpAddrTable Lib iphlpapi.dll MIB_IPADDRTABLE, pdwSize As Long, bOrder As Long) As Long参数说明:pIpAddrTable :输出 指向一个接收网卡 IP 地址映射表的 针。MIB_IPADDR

47、TABLE 类型的指pdwSize: 输入,输出 输入,指定 pIpAddrTable 参数指向缓存的大小;输出,如果指定的 缓存大小不够大,将设置此参数为必须的大小。bOrder:输入 指定返回的映射表是否按照 IP 地址排列。 TRUE ,按顺序排列。返回值:成功,返回 0;失败,返回错误代码。2、使用到的类型:MIB_IPADDRTABLE 包含 IP 地址入口表Type MIB_IPADDRTABLEdwNumEntries As Long表明 table 字段数组中有多少 MIB_IPADDROW条目table() As MIB_IPADDRROW 指向 MIB_IPADDRROW

48、类型End TypeMIB_IPADDRROW 指定特殊 IP 地址的信息Type MIB_IPADDRROWdwAddr As Long接口的 IP 地址dwIndex As Long与 IP 地址关联的接口之索引dwMask As Long子网掩码dwBCastAddr As Long广播地址dwReasmSize As Long 已收到的数据报重装后的最大长度unused1 As Integer未使用unused2 As Integer未使用End Type3、使用到的常量:无4、主要代码分析: 定义一个 MIB_IPADDRTABLE 类型的变量并获 取此变量 的大小 ,然后 直接调

49、用 GetTcpTable:Dim IpAddrTable As MIB_IPADDRTABLEdwsize = Len(IpAddrTable)r = GetIpAddrTable(IpAddrTable, dwsize, order)调用 For Next 循环,获取每个网卡 IP 地址映射的信息:For i = 0 To IpAddrTable.dwNumEntries - 1Print dwAddr, IpAddrTable.table(i).dwAddrNext 将长整型格式的 ip 地址转换为标准 IP 地址格式( xxx.xxx.xxx.xxx 格式):Private Funct

50、ion inversaip(IPAddrLng As Long) As StringDim sos As StringDim i As LongDim IPadd As StringIPadd = Right(00000000 & Hex(IPAddrLng), 8) sos =For i = 1 To Len(IPadd) Step 2sos = CInt(&h & Mid(IPadd, i, 2) & . & sosNext iinversaip = Mid(sos, 1, Len(sos) - 1)End Function5、运行时截图:第十节 获取本机已探测的 IP 物理地址映射表1、

51、函数:Private Declare Function GetIpNetTable Lib iphlpapi.dll (pIpNetTable As MIB_IPNETTABLE,pdwSize As Long, bOrder As Long) As Long参数说明:pIpNetTable:输出指向一个返回 IP 至物理地址映射作为 MIB_IPNETTABLE 类型的缓存。pdwSize: 输入,输出 输入,指定 pIpNetTable 参数指向缓存的大小;输出,如果指定的 缓存大小不够大,将设置此参数为必须的大小。bOrder:输入 指定返回的映射表是否按照 IP 地址排列。 TRUE

52、,按序排列。返回值:成功,返回 0;失败,返回错误代码。2、使用到的类型:MIB_IPNETTABLE 包含地址解析协议 (ARP :Address Resolution Protocol )接口入口表。Type MIB_IPNETTABLEDwNumEntries As Long MIB_IPNETROW 类型的总数MIB_Table() As MIB_IPNETROW 针End Type当前包含指向一个包含 MIB_IPNETROW 类型的指: Address Resolution Protocol )接口信息:(字节 ) ,通常为 6字节数组,包含适配器的物理地址IP 地址ARP 接口的

53、类型,以下值之一:值说明1其他条目2无效条目3动态条目4静态条目 MIB_IPNETROW 包含地址解析协议( ARPType MIB_IPNETROWdwIndex As Long指定适配器的索引dwPhysAddrLen As LongbPhysAddrs 字段包含的物理接口的长度bPhysAddr(MAXLEN_PHYSADDR) As Byte dwAddr As Long dwType As Long常量名称MIB_IPNET_TYPE_OTHERMIB_IPNET_TYPE_INV ALIDMIB_IPNET_TYPE_DYNAMICMIB_IPNET_TYPE_STA TICEn

54、d Type3、使用到的常量:Const MAXLEN_PHYSADDR = 74、主要代码分析: 定义一 个 MIB_IPNETTABLE 类型 的变量 并获取此变量的大小,然后 直接调 用 GetIpNetTable :Dim ipNett As MIB_IPNETTABLEdwsize = Len(ipNett)r = GetIpNetTable(ipNett, dwsize, bOrder)调用 For Next 循环,获取每个网卡 IP 地址映射的信息:For i = 0 To ipNett.dwNumEntries - 1Print 类型, ipNett.MIB_Table(i).dwTypeNext 在中循环获取物理地址:ByteToS = Byte

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论