2023年12月15日发(作者:)

在vb中使用获取网络信息

第一章 前言

Windows 98以上的操作系统在系统目录下都带有这个动态链接库文件,它可以帮助程序员方便地获取计算机网络信息。对于C程序员来说,只要有iphlpapi的头文件,调用是很简单的事,但是对于Vb程序员则是比较困难的问题。本文将就Vb中调用来介绍iphlpapi的使用。

第二章 IPHLPAPI 的主要函数

本章将根据提供函数的功能来分别讲解的主要函数。编程时,我们可以调用这些函数迅速获得本机大部分网络信息。

第一节 获取本机网络适配器的信息

1、函数:

Private Declare Function GetAdaptersInfo Lib "" ( 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_INFO

Next 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_STRING

Next As Long ‘指向列表中下一个IP_ADDR_STRING类型。为空,则是最后一个地址

IpAddress As String * 16 ‘点式十进制字串表示Ip地址

IpMask As String * 16 ‘子网掩码

Context As Long ‘网络IP地址标识,符合AddIPAddress和DeleteIPAddress函数中的网

‘接口关联参数。

End Type

3、使用到的常量:

Const MAX_ADAPTER_NAME_LENGTH = 260 //适配器名字长度

Const MAX_ADAPTER_ADDRESS_LENGTH = 8 //适配器物理地址长度

Const MAX_ADAPTER_DESCRIPTION_LENGTH = 132 //适配器描述长度

4、主要代码分析:

①调用函数GetAdaptersInfo,以及在调用中应该注意的问题:对函数GetAdaptersInfo进行两次调用,第一次调用获得参数pOutBufLen的实际大小;第二次调用获取IpAdapterInfo的数据。代码如下:

pOutBufLen = 0

error = 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类型:

Do

pAdapt =

If pAdapt <> 0 Then

CopyMemory AdapterInfo, ByVal pAdapt, AdapterInfoSize

End If

Loop Until pAdapt = 0

④由每次获得的IP_ADAPTER_INFO类型来获取网络适配器物理地址:

PhysicalAddress = ""

For i = 0 To sLength - 1

PhysicalAddress = PhysicalAddress & Hex(s(i))

If i < sLength - 1 Then

PhysicalAddress = PhysicalAddress & "-"

End If

Next

⑤对于属于IP_ADDR_STRING类型的IpAddressList、GatewayList、DhcpServer、PrimaryWinsServer、SecondaryWinsServer,同样要注意IP_ADDR_STRING中Next成员的使用:

Do

CopyMemory IP_ADDR_STRING, essList,

LenB(IP_ADDR_STRING)

Print "IP Address: " & IP_ADDR_ess

Print "Subnet Mask: " & IP_ADDR_

pAddrStr = IP_ADDR_

If pAddrStr <> 0 Then

CopyMemory IP_ADDR_essList, ByVal pAddrStr, _

LenB(IP_ADDR_essList)

End If

Loop Until pAddrStr = 0

5、运行时截图:

第二节 获取MIB-II 接口表

1、函数:

Private Declare Function GetIfTable Lib "" (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_IFTABLE

dwNumEntries As Long '当前网络接口的总数

MIB_Table(9) As MIB_IFROW '指向一个包含MIB_IFROW类型的指针

End Type

②MIB_IFROW 保存接口信息

Private Type MIB_IFROW

wszName(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_STATUS_NON_OPERATIONAL 0 网络适配器被禁止,例如:地址冲突

MIB_IF_OPER_STATUS_UNREACHABLE 1 没有连接

MIB_IF_OPER_STATUS_DISCONNECTED 2 局域网:电缆未连接;广域网:无载波信号

MIB_IF_OPER_STATUS_CONNECTING 3 广域网适配器连接中

MIB_IF_OPER_STATUS_CONNECTED 4 广域网适配器连接上远程对等点

MIB_IF_OPER_STATUS_OPERATIONAL 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 Type

3、使用到的常量:

4、主要代码分析:

①分配足够大的缓存空间,然后直接调用GetIfTable获得接口信息:

Dim ifT As MIB_IFTABLE

LenIfT = Len(ifT)

RValue = GetIfTable(ifT, LenIfT, True)

②由ntries获得接口数量,然后用for„next循环获取每个接口信息:

For i = 0 To ntries - 1

Print "接口编号:" & _Table(i).dwIndex

Print "接口速度:" & _Table(i).dwSpeed

Next

③物理地址的获得:

PhysAddr = Right("00" & Hex(_Table(i).bPhysAddr(0)), 2)

For j = 1 To 5

PhysAddr = PhysAddr & "-" & Right("00" & Hex(_Table(i).bPhysAddr(j)), 2)

Next

Print "物理地址:" & PhysAddr

5、运行时截图:

第三节 获取本机TCP 信息列表

1、函数:

Private Declare Function GetTcpStatistics Lib "" (ByRef pTcpStats As

MIB_TCPSTATS) As Long

参数说明:

pStats :[输出]指向一个接收本机TCP统计表的MIB_TCPSTATS类型

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

2、使用到的类型:

①MIB_TCPSTATS 包含本机上正运行的TCP协议的统计表

Type MIB_TCPSTATS

dwRtoAlgorithm As Long ‘指定重传输(RTO:retransmission time-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 Long ‘收到分段数据报的数目

dwOutSegs As Long ‘传输的分段数据报数目,不包括转发的数据包

dwRetransSegs As Long ‘转发的分段数据报数目

dwInErrs As Long ‘收到错误的数目

dwOutRsts As Long ‘重设标志设定后传输分段数据报数目

dwNumConns As Long ‘累计连接的总数

End Type

3、使用到的常量:

4、主要代码分析:

① 定义一个MIB_TCPSTATS类型变量,然后直接调用GetTcpStatistics:

Dim mTcpS As MIB_TCPSTATS

RValue = GetTcpStatistics(mTcpS)

5、运行时截图:

第四节 获取当前TCP连接情况

1、函数:

Private Declare Function GetTcpTable Lib "" (ByRef pTcpTable As MIB_TCPTABLE,

ByRef pdwSize As Long, ByVal bOrder As Long) As Long

参数说明:

pTcpTable:[输入]指向包含了MIB_TCPTABLE类型的TCP 连接表。

pdwSize:[输入,输出]指向pTcpTable参数的缓冲区大小,如果分配的缓冲不够,那么就等于最小需要缓冲。

bOrder:[输入]指定连接表是否按照类型排列。TRUE,那么就按以下类型顺序排列:Local IP

address,Local port,Remote IP address,Remote port。

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

2、使用到的类型:

①MIB_TCPTABLE 类型包含Tcp连接表。

Type MIB_TCPTABLE

dwNum_Of_Entries As Long ‘当前包含MIB_TCPROW类型的总数

TCP_Table() As MIB_TCPROW ‘指向包含MIB_TCPROW类型的指针

End Type

备注:实际使用中可以定义:TCP_Table(120) As MIB_TCPROW ' 预留足够缓存

②MIB_TCPROW 类型包含了TCP连接信息。

Type MIB_TCPROW

dwState As Long ' TCP连接状态,为以下值之一:

常量名称 值 说明

MIB_TCP_STATE_CLOSED 1 关闭

MIB_TCP_STATE_LISTEN 2 正在监听

MIB_TCP_STATE_SYN_SENT 3 同步发送

MIB_TCP_STATE_SYN_RCVD 4 同步接收

MIB_TCP_STATE_ESTAB 5 已建立

MIB_TCP_STATE_FIN_WAIT1 6 FINWAIT 1

MIB_TCP_STATE_FIN_WAIT2 7 FINWAIT 2

MIB_TCP_STATE_CLOSE_WAIT 8 关闭等待

MIB_TCP_STATE_CLOSING 9 正在关闭

MIB_TCP_STATE_LAST_ACK 10 最后一次确认

MIB_TCP_STATE_TIME_WAIT 11 时间等待

MIB_TCP_STATE_DELETE_TCB 12 删除连接

dwLocalAddr As Long '本地IP

dwLocalPort As Long '本地端口

dwRemoteAddr As Long '远程机器IP

dwRemotePort As Long '远程机器端口

End Type

3、使用到的常量:

4、主要代码分析:

①定义一个MIB_TCPTABLE类型的变量,因为我们在定义MIB_TCPTABLE类型的时候预留了足够的缓存( TCP_Table(120) As MIB_TCPROW ),因此获得定义变量的大小后直接调用GetTcpTable,但是要注意的是,实际获得的TCP连接的总数应为dwNum_Of_Entries的值,一般小于我们的定义(120):

Dim mtcp As MIB_TCPTABLE

mtcplen = Len(mtcp)

rvalue = GetTcpTable(mtcp, mtcplen, True)

②使用For„Next循环遍历各个Tcp连接的信息:

For i = 0 To _Of_Entries - 1

Print _Table(i).dwLocalAddr & "->" & _Table(i).dwRemoteAddr

Next

③因为MIB_TCPROW 类型中dwLocalAddr、dwRemoteAddr均为一长整型数,因此要通过转换来获得IP地址:

Dim Ip_Buf(1 To 4) As Byte

CopyMemory Ip_Buf(1), dwLocalAddr, 4

GetIp = CStr(Ip_Buf(1)) + "." + CStr(Ip_Buf(2)) + "." + CStr(Ip_Buf(3)) + "." + CStr(Ip_Buf(4))

④因为MIB_TCPROW 类型中dwLocalPort、dwRemotePort均为一长整型数,因此要通过转换来获得端口:

GetPort = dwLocalPort/ 256 + (dwLocalPort Mod 256) * 256

5、运行时截图:

第五节 获取本机UDP信息列表

1、函数:

Private Declare Function GetUdpStatistics Lib "" (pStats As MIB_UDPSTATS) As

Long

参数说明:

pStats:[输出]指向一个接收到本机UDP统计表的MIB_UDPSTATS类型

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

2、使用到的类型:

①MIB_UDPSTATS 包含UDP (User Datagram Protocol) 运行信息

Type MIB_UDPSTATS

dwInDatagrams As Long '已收到数据报数目

dwNoPorts As Long '因为端口号有误而丢弃的数据报数目

dwInErrors As Long '已收到多少错误数据报,不包括dwNoPorts中统计的数目

dwOutDatagrams As Long '已传输数据报数目

dwNumAddrs As Long 'UDP监听者表中接口数目

End Type

3、使用到的常量:

4、主要代码分析:

①定义一个MIB_UDPSTATS类型的变量,然后直接使用GetUdpStatistics函数即可:

Dim Mudp As MIB_UDPSTATS

r = GetUdpStatistics(Mudp)

5、运行时截图:

第六节 获取当前UDP连接情况

1、函数:

Private Declare Function GetUdpTable Lib "" (ByRef pTcpTable

MIB_UDPTABLE, ByRef pdwSize As Long, ByVal bOrder As Long) As Long

参数说明:

pUdpTable:[输出]指向一个缓存作为MIB_UDPTABLE类型用来接收UDP监听表。

As

pdwSize:[输入或输出]输入,指定pUdpTable参数所占缓存大小;输出,如果指定的缓存大小不足,将设置为所须的大小。

bOrder:[输入]指定返回的表是否按分类排列。如果为TRUE,按以下分类排列:1、IP地址;2、端口。

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

2、使用到的类型:

①MIB_UDPTABLE 包含MIB_UDPROW类型

Type MIB_UDPTABLE

dwNum_Of_Entries As Long '当前 UDP连接的总数

UDP_Table() As MIB_UDPROW '指向包含MIB_UDPROW类型的指针

End Type

备注:实际使用中可以定义:UDP_Table(120) As MIB_UDPROW ' 预留足够缓存

②MIB_UDPROW包含发送和接收UDP数据包的地址信息。它的格式如下:

Type MIB_UDPROW

dwLocalAddr As Long '本地IP

dwLocalPort As Long '本地端口

End Type

3、使用到的常量:

4、主要代码分析:

①定义一个MIB_TCPTABLE类型的变量,因为我们在定义MIB_TCPTABLE类型的时候预留了足够的缓存( TCP_Table(120) As MIB_TCPROW ),因此获得定义变量的大小后直接调用GetTcpTable。但是要注意的是,实际获得的UDP连接的总数应为dwNum_Of_Entries的值,一般小于我们的定义(120):

Dim Mudp As MIB_UDPTABLE

mudplen = Len(Mudp)

rvalue = GetUdpTable(Mudp, mudplen, True)

②使用For„Next循环遍历各个Tcp连接的信息:

For i = 0 To _Of_Entries - 1

Print _Table(i).dwLocalAddr & ":" &

_Table(i).dwLocalPort

Next

③因为MIB_UDPTABLE 类型中dwLocalAddr为一长整型数,因此要通过转换来获得IP地址:

Dim Ip_Buf(1 To 4) As Byte

CopyMemory Ip_Buf(1), dwLocalAddr, 4

GetIp = CStr(Ip_Buf(1)) + "." + CStr(Ip_Buf(2)) + "." + CStr(Ip_Buf(3)) + "." + CStr(Ip_Buf(4))

④因为MIB_UDPTABLE类型中dwLocalPort为一长整型数,因此要通过转换来获得端口:

GetPort = dwLocalPort/ 256 + (dwLocalPort Mod 256) * 256

5、运行时截图:

第七节 获取本机网间控制报文协议(ICMP:Internet Control Message Protocol)信息

1、函数:

Private Declare Function GetIcmpStatistics Lib "" (pStats As MIB_ICMP) As Long

参数说明:

pStats:[输出] 指向一个本机收到ICMP 统计表的MIB_ICMP类型。

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

2、使用到的类型:

①MIB_ICMP 为特殊适配器包含网间控制报文协议(ICMP:Internet Control Message

Protocol)统计表。

Public Type MIB_ICMP

stats As MIBICMPINFO '指定MIBICMPINFO类型包含了电脑ICMP统计信息表

End Type

②MIBICMPINFO通过MIBICMPSTATS结构存储的接收或发出的ICMP信息。

Public Type MIBICMPINFO

icmpInStats As MIBICMPSTATS '指向MIBICMPSTATS类型,包含接收数据

icmpOutStats As MIBICMPSTATS '指向MIBICMPSTATS类型,包含发出数据

End Type

③MIBICMPSTATS包含ICMP (Internet Control Message Protocol)接收或发出的统计信息。

Public Type MIBICMPSTATS

dwMsgs As Long '已收发多少消息

dwErrors As Long '已收发多少错误

dwDestUnreachs As Long '已收发多少"目标不可抵达"消息

dwTimeExcds As Long '已收发多少生存期已过消息

dwParmProbs As Long '已收发多少表明数据报内有错误IP信息的消息

dwSrcQuenchs As Long '已收发多少源结束消息

dwRedirects As Long '已收发多少重定向消息

dwEchos As Long '已收发多少ICMP响应请求

dwEchoReps As Long '已收发多少ICMP响应应答

dwTimestamps As Long '已收发多少时间戳请求

dwTimestampReps As Long '已收发多少时间戳响应

dwAddrMasks As Long '已收发多少地址掩码

dwAddrMaskReps As Long '已收发多少地址掩码响应

End Type

3、使用到的常量:

4、主要代码分析:

①定义一个MIB_ICMP类型的变量,然后直接调用GetIcmpStatistics:

Dim Micmp As MIB_ICMP

r = GetIcmpStatistics(Micmp)

②使用Stats成员获取收到的数据信息;使用tStats成

员获取发送的数据信息。

5、运行时截图:

第八节 获取本机网络参数

1、函数:

Private Declare Function GetNetworkParams Lib "" (FixedInfo As Any, pOutBufLen

As Long) As Long

参数说明:

pFixedInfo:[输出]指向一个接收本机网络参数的数据块。

pOutBufLen:[输入,输出]指向一个ULONG变量,改变量指定了FixedInfo参数的大小。如果指定的大小不够大,将设置为须要的大小并返回ERROR_BUFFER_OVERFLOW错误。

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

2、使用到的类型:

①IP_ADDR_STRING描述IP 地址链表的节点。

见 第二章 第一节 2 ②

②FIXED_INFO包含电脑网络参数信息

Type FIXED_INFO

HostName As String * MAX_HOSTNAME_LEN ‘本机名

DomainName As String * MAX_DOMAIN_NAME_LEN ‘本机DNS域

CurrentDnsServer As Long ‘保留,使用DnsServerList获取DNS服务器的IP地址

DnsServerList As IP_ADDR_STRING ‘本机采用的DNS服务器链表

NodeType As Long ‘节点类型,以下值:

1 BROADCAST_NODETYPE IP广播,b节点NetBIOS名字解析法

2 PEER_TO_PEER_NODETYPE 点到点通信,p节点名字解析

4 MIXED_NODETYPE Mixed,m节点NetBIOS名字解析法

8 HYBRID_NODETYPE Hybrid,h节点NetBIOS名字解析法

Else 未知节点类型

ScopeId As String * MAX_SCOPE_ID_LEN ‘DHCP范围名字

EnableRouting As Long ‘本机能否路由

EnableProxy As Long ‘本机能否作为地址解析协议(ARP)代理

EnableDns As Long ‘本机能否DNS查询

End Type

备注:此类型在vb中和c中的定义有所不同,详情请参看MSDN。

3、使用到的常量:

Const MAX_HOSTNAME_LEN = 132

Const MAX_DOMAIN_NAME_LEN = 132

Const MAX_SCOPE_ID_LEN = 260

4、主要代码分析:

①由于IP_ADDR_STRING的实际大小未知,我们不能直接获取其大小,所以首先对函数GetNetworkParams进行两次调用,第一次调用获得参数pOutBufLen的实际大小;第二次调用获取FixedInfoBuffer(0)的数据。代码如下:

Dim FixedInfoBuffer() As Byte

FixedInfoSize = 0

rvalue = GetNetworkParams(ByVal 0, FixedInfoSize)

ReDim FixedInfoBuffer(FixedInfoSize - 1)

rvalue = GetNetworkParams(FixedInfoBuffer(0), FixedInfoSize)

②使用copymemory函数将数据拷贝到FixedInfo中,然后就可以使用FIXED_INFO结构了:

CopyMemory FixedInfo, FixedInfoBuffer(0), FixedInfoSize

Print "Host Name", me

③采用Do循环来获取所有DNS服务器地址:

Print "DnsServer IP", ess

pAddrStr =

Do While pAddrStr <> 0

CopyMemory IPAS, ByVal pAddrStr, LenB(IPAS)

Print "DNSServer IP", ess

pAddrStr =

Loop

5、运行时截图:

第九节 获取网卡–IP地址映射表

1、函数:

Private Declare Function GetIpAddrTable Lib "" (pIpAddrTable As

MIB_IPADDRTABLE, pdwSize As Long, bOrder As Long) As Long

参数说明:

pIpAddrTable:[输出] 指向一个接收网卡–IP地址映射表的 MIB_IPADDRTABLE类型的指针。

pdwSize:[输入,输出]输入,指定pIpAddrTable 参数指向缓存的大小;输出,如果指定的缓存大小不够大,将设置此参数为必须的大小。

bOrder:[输入] 指定返回的映射表是否按照IP地址排列。TRUE,按顺序排列。

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

2、使用到的类型:

①MIB_IPADDRTABLE 包含IP地址入口表

Type MIB_IPADDRTABLE

dwNumEntries As Long '表明table字段数组中有多少MIB_IPADDROW条目

table() As MIB_IPADDRROW '指向MIB_IPADDRROW类型

End Type

②MIB_IPADDRROW 指定特殊IP地址的信息

Type MIB_IPADDRROW

dwAddr As Long '接口的IP地址

dwIndex As Long '与IP地址关联的接口之索引

dwMask As Long '子网掩码

dwBCastAddr As Long ’广播地址

dwReasmSize As Long '已收到的数据报重装后的最大长度

unused1 As Integer '未使用

unused2 As Integer '未使用

End Type

3、使用到的常量:

4、主要代码分析:

①定义一个MIB_IPADDRTABLE类型的变量并获取此变量的大小,然后直接调用GetTcpTable:

Dim IpAddrTable As MIB_IPADDRTABLE

dwsize = Len(IpAddrTable)

r = GetIpAddrTable(IpAddrTable, dwsize, order)

②调用For„Next循环,获取每个网卡–IP地址映射的信息:

For i = 0 To ntries - 1

Print "dwAddr", (i).dwAddr

Next

③将长整型格式的ip地址转换为标准IP地址格式(""格式):

Private Function inversaip(IPAddrLng As Long) As String

Dim sos As String

Dim i As Long

Dim IPadd As String

IPadd = Right("00000000" & Hex(IPAddrLng), 8)

sos = ""

For i = 1 To Len(IPadd) Step 2

sos = CInt("&h" & Mid(IPadd, i, 2)) & "." & sos

Next i

inversaip = Mid(sos, 1, Len(sos) - 1)

End Function

5、运行时截图:

第十节 获取本机已探测的IP – 物理地址映射表

1、函数:

Private Declare Function GetIpNetTable Lib "" (pIpNetTable As MIB_IPNETTABLE,

pdwSize As Long, bOrder As Long) As Long

参数说明:

pIpNetTable:[输出]指向一个返回IP至物理地址映射作为MIB_IPNETTABLE类型的缓存。

pdwSize:[输入,输出] 输入,指定pIpNetTable参数指向缓存的大小;输出,如果指定的缓存大小不够大,将设置此参数为必须的大小。

bOrder:[输入] 指定返回的映射表是否按照IP地址排列。TRUE,按序排列。

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

2、使用到的类型:

①MIB_IPNETTABLE 包含地址解析协议(ARP :Address Resolution Protocol)接口入口表。

Type MIB_IPNETTABLE

DwNumEntries As Long ‘当前包含MIB_IPNETROW类型的总数

MIB_Table() As MIB_IPNETROW ‘指向一个包含MIB_IPNETROW类型的指针

End Type

②MIB_IPNETROW 包含地址解析协议(ARP :Address Resolution Protocol)接口信息:

Type MIB_IPNETROW

dwIndex As Long '指定适配器的索引

dwPhysAddrLen As Long 'bPhysAddrs字段内包含的物理接口的长度(字节),通常为6

bPhysAddr(MAXLEN_PHYSADDR) As Byte '字节数组,包含适配器的物理地址

dwAddr As Long 'IP地址

dwType As Long 'ARP接口的类型,以下值之一:

常量名称 值 说明

MIB_IPNET_TYPE_OTHER 1 其他条目

MIB_IPNET_TYPE_INVALID 2 无效条目

MIB_IPNET_TYPE_DYNAMIC 3 动态条目

MIB_IPNET_TYPE_STATIC 4 静态条目

End Type

3、使用到的常量:

Const MAXLEN_PHYSADDR = 7

4、主要代码分析:

①定义一个MIB_IPNETTABLE类型的变量并获取此变量的大小,然后直接调用GetIpNetTable:

Dim ipNett As MIB_IPNETTABLE

dwsize = Len(ipNett)

r = GetIpNetTable(ipNett, dwsize, bOrder)

②调用For„Next循环,获取每个网卡–IP地址映射的信息:

For i = 0 To ntries - 1

Print "类型", _Table(i).dwType

Next

③在②中循环获取物理地址:

ByteToS = ""

ByteToS = Right("00" & Hex(_Table(i).bPhysAddr(0)), 2)

For j = 1 To _Table(i).dwPhysAddrLen - 1 Step 1

ByteToS = ByteToS & "-" & Right("00" & Hex(_Table(i).bPhysAddr(j)), 2)

Next

④将长整型格式的ip地址转换为标准IP地址格式(""格式):

Private Function inversaip(IPAddrLng As Long) As String

‘同 十、 4、 ③

End Function

5、运行时截图:

第十一节 获取当前计算机的IP信息

1、函数:

Private Declare Function GetIpStatistics Lib "" (pStats As MIB_IPSTATS) As Long

参数说明:

pStats:[输出] 指向一个包含IP信息的MIB_IPSTATS类型。

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

2、使用到的类型:

①MIB_IPSTATS 存储于电脑的IP协议运行信息。

Type MIB_IPSTATS

dwForwarding As Long '启用或者禁止转发IP包(IP forwarding)

dwDefaultTTL As Long '指定默认初始化的生存时间(TTL)的值

dwInReceives As Long '已收到数据包数目

dwInHdrErrors As Long '已收到报头有误的数据包数目

dwInAddrErrors As Long '已收到地址有误的数据包数目

dwForwDatagrams As Long '已转发数据报数目

dwInUnknownProtos As Long '已收到协议不明的数据报数目

dwInDiscards As Long '已收到多少已丢弃的数据报

dwInDelivers As Long '已收到多少已投递的数据报

dwOutRequests As Long '发送IP请求传输的数据报数目,不包括转发的数据包

dwRoutingDiscards As Long '已丢弃的发送数据报数目

dwOutDiscards As Long '丢弃的传输数据报数目

dwOutNoRoutes As Long '没有路由目标IP地址而被丢弃的数据报数目

dwReasmTimeout As Long '分段数据报完全到达的最长时间,再此时间之外数据将被丢弃

dwReasmReqds As Long '需要重组的数据报数目

dwReasmOks As Long '已成功重组的数据报数目

dwReasmFails As Long '不能进行重组的数据报数目

dwFragOks As Long '已成功进行分段的数据报数目

dwFragFails As Long '不能进行分段的数据报数目,这些数据包将被丢弃

dwFragCreates As Long '可被分段的数据报数目

dwNumIf As Long '接口数目

dwNumAddr As Long '与此计算机关联的IP地址数目

dwNumRoutes As Long '路由表中可用的路由数目

End Type

3、使用到的常量:

4、主要代码分析:

①定义一个MIB_IPSTATS类型的变量,然后直接调用GetIpStatistics:

Dim MI As MIB_IPSTATS

r = GetIpStatistics(MI)

Print "启用或者禁止转发IP包", arding

5、运行时截图:

第十二节 获得本机系统网络接口适配器的列表

1、函数:

Private Declare Function GetInterfaceInfo Lib "" (pIfTable As IP_INTERFACE_INFO,

dwOutBufLen As Long) As Long

参数说明:

pIfTable: [输入] 指向一个指定一个包含了适配器列表的IP_INTERFACE_INFO类型的缓存。这个缓存应当由调用者分配。

dwOutBufLen:[输出] 指向一个DWORD变量。如果pIfTable参数为空,或者缓存不够大,这个参数返回必须的大小。

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

2、使用到的类型:

①IP_INTERFACE_INFO 包含本机系统网络适配器列表

Public Type IP_INTERFACE_INFO

NumAdapters As Long '适配器编号

Adapter(1) As IP_ADAPTER_INDEX_MAP 'IP_ADAPTER_INDEX_MAP类型的数组

End Type

②IP_ADAPTER_INDEX_MAP 存储和适配器名称关联的接口序号

Public Type IP_ADAPTER_INDEX_MAP

Index As Long '和适配器关联的接口序号

Name As String * MAX_ADAPTER_NAME_LENGTH

'指向一个包含了适配器名称的Unicode字符串

End Type

3、使用到的常量:

Const MAX_ADAPTER_NAME_LENGTH = 260

4、主要代码分析:

①定义一个IP_INTERFACE_INFO类型的变量,对函数GetInterfaceInfo进行两次调用,第一次调用获得参数dwOutBufLen的实际大小;第二次调用获取pIfTable数据:

Dim pIfTable As IP_INTERFACE_INFO

r = GetInterfaceInfo(pIfTable, dwOutBufLen)

r = GetInterfaceInfo(pIfTable, dwOutBufLen)

②调用For„Next循环,获取每个网络接口适配器的信息,使用StrConv函数对获得的Unicode适配器名称进行转换:

For i = 0 To pters - 1

Print r(i).Index

Print StrConv(r(i).Name, vbFromUnicode)

Next

5、运行时截图:

第十三节 获得目的地IP(只能是所在局域网中的IP)对应的物理地址

1、函数:

①Private Declare Function SendARP Lib "" (ByVal DestIP As Long, ByVal SrcIP As

Long, pMacAddr As Long, PhyAddrLen As Long) As Long

参数说明:

DestIP:[输入]目的地IP地址。

SrcIP:[输入]发送地IP地址。可选参数,调用者可以指定此参数为0。

pMacAddr:[输出]指向一个ULONG变量数组(array)。数组前6个字节(bytes)接收由 DestIP指定的目的地IP物理地址。

PhyAddrLen:[输入,输出]输入,指定用户设置pMacAddr接收MAC地址的最大缓存大小,单位字节;输出,指定了写入pMacAddr的字节数量。

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

② inet_addr是Winsocket的函数而非””提供的函数,目的是将标准IP地址(””)的字符串转为电脑能识别的长整型的数据。

Private Declare Function inet_addr Lib "" (ByVal cp As String) As Long

参数说明:

cp:要转换的””形式的ip地址

2、使用到的类型:

3、使用到的常量:

4、主要代码分析:

①定义目标ip地址和源ip地址,源ip地址可以为0或inet_addr("127.0.0.1")或inet_addr(本机某个ip)。

Dim Dip As Long

Dim Sip As Long

Dip = inet_addr("")

Sip = 0 'inet_addr("127.0.0.1")

②定义获得的目标ip对应的物理地址,这里应采用定义:

Dim Maca(1) As Long

③调用SendARP函数:

PhyaddrL = 6

r = SendARP(Dip, Sip, Maca(0), PhyaddrL)

④如果探测的目标地址不存在,产生错误31,否则SendARP将返回0

Print Hex(Maca(0)), Hex(Maca(1))

'注意显示值为 aabbccdd eeff ,对应物理地址为 dd-cc-bb-aa-ff-ee

‘以下是真正的物理地址:

Print Right(Hex(Maca(0)), 2) & "-" & Mid(Hex(Maca(0)), 5, 2) & "-" & Mid(Hex(Maca(0)), 3, 2)

& "-"; Left(Hex(Maca(0)), 2) & "-" & Right(Hex(Maca(1)), 2) & "-" & Left(Hex(Maca(1)), 2)

5、运行时截图:

第十四节 返回本机网络接口数量

1、函数:

Private Declare Function GetNumberOfInterfaces Lib "" (pdwNumIf As Long) As

Long

参数说明:

pdwNumIf:[输出] 指向一个接收本机接口数量的变量。

备注:返回的接口数包括loopback接口。这个数目比GetAdaptersInfo和GetInterfaceInfo函数返回的适配器数目要多一,因为那两个函数不返回loopback接口的信息。

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

2、使用到的类型:

3、使用到的常量:

4、主要代码分析:

①定义一个Long型变量,然后直接调用函数GetNumberOfInterfaces即可:

Dim dwNumIf As Long

r = GetNumberOfInterfaces(dwNumIf)

Print "本机接口数量", dwNumIf

5、运行时截图:

第十五节 设置本机默认的生存时间(time-to-live:TTL)值

1、函数:

Private Declare Function SetIpTTL Lib "" (ByVal nTTL As Long) As Long

参数说明:

nTTL: [输入] 本机的新的生存时间(TTL)

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

2、使用到的类型:

3、使用到的常量:

4、主要代码分析:

①定义一个Ttl值,如64、128等,然后直接调用函数SetIpTTL:

Ttl = 128

r = SetIpTTL(Ttl)

5、运行时截图:

第十六节 获取本机IP 路由表

1、函数:

Private Declare Function GetIpForwardTable Lib "" (pIpForwardTable As

MIB_IPFORWARDTABLE , pdwSize As Long, bOrder As Long) As Long

参数说明:

pIpForwardTable:[输出]指向接收IP路由表作为MIB_IPFORWARDTABLE类型的缓存

pdwSize:[输入,输出] 输入,指定 pIpForwardTable参数指向缓存的大小;输出,如果指定的缓存大小不够大,将设置此参数为必须的大小。

bOrder:[输入] 指定返回的映射表是否按照种类排列。TRUE,按以下顺序排列:目的地地址;生成路由的协议;多路径路由策略;下一跃点的地址。

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

2、使用到的类型:

①MIB_IPFORWARDTABLE 包含了IP路由表接口。

Type MIB_IPFORWARDTABLE

dwNumEntries As Long '表中路由接口数目

Table(120) As MIB_IPFORWARDROW '指向MIB_IPFORWARDROW类型阵列

End Type

②MIB_IPFORWARDROW 包含描述IP网络路由的信息

public type MIB_IPFORWARDROW

dwForwardDest as long '目的地IP地址

dwForwardMask as long '目的地主机的子网掩码

dwForwardPolicy as long '将会引起多通道路由选择的设置条件。参看RFC 1354。

dwForwardNextHop as long '路由器中IP地址的下一个跃点

dwForwardIfIndex as long '路由的接口序号

dwForwardType as long 'RFC 1354中路由的定义,以下值之一:

----------------------------------------------------------------------------------------------

常量名称 值 说明

MIB_IPROUTE_TYPE_OTHER 1 其他

MIB_IPROUTE_TYPE_INVALID 2 非法路由

MIB_IPROUTE_TYPE_DIRECT 3 下一个跃点是目的地(本地路由)

MIB_IPROUTE_TYPE_INDIRECT 4 下一个跃点不是目的地 (远程路由)

-----------------------------------------------------------------------------------------------

dwForwardProto as long '生成路由的协议,具体IPX协议值参看Routprot.h,而IP条目参看Iprtrmib.h

dwForwardAge as long '路由持续时间,毫秒。仅用于路由远程访问服务(RRAS:Routing and Remote Access Service)运行时候,并且仅当路由类型为PROTO_IP_NETMGMT。

dwForwardNextHopAS as long '下一跃点的自治系统编号

dwForwardMetric1 as long '路由协议专有的公制值。详情参见RFC 1354。

dwForwardMetric2 as long '路由协议专有的公制值。详情参见RFC 1354。

dwForwardMetric3 as long '路由协议专有的公制值。详情参见RFC 1354。

dwForwardMetric4 as long '路由协议专有的公制值。详情参见RFC 1354。

dwForwardMetric5 as long '路由协议专有的公制值。详情参见RFC 1354。

End Type

3、使用到的常量:

4、主要代码分析:

①定义一个MIB_IPFORWARDTABLE类型的变量,对函数GetIpForwardTable进行两次调用,第一次调用获得参数pdwSize的实际大小;第二次调用获取pIpForwardTable数据:

Dim mIF As MIB_IPFORWARDTABLE

r = GetIpForwardTable(mIF, dwsize, order)

r = GetIpForwardTable(mIF, dwsize, order)

②调用For„Next循环,获取每个路由的信息:

For i = 0 To ntries - 1

Realip = inversaip((i).dwForwardDest)

RealMask = inversaip((i).dwForwardMask)

Print "ip", Realip

Print "mask", RealMask

Next

③将长整型格式的ip地址转换为标准IP地址格式(""格式):

Private Function inversaip(IPAddrLng As Long) As String

‘同本章第九节 4 ③

End Function

5、运行时截图:

第十七节 设置TCP连接状态

1、函数:

①Private Declare Function SetTcpEntry Lib "" (pTcpTable As MIB_TCPROW) As

Long

参数说明:

PTcpRow:[输入]指向MIB_TCPROW类型,这个类型指定了TCP连接的标识,也指定了TCP连接的新状态。调用者必须指定此类型中所有成员的值。

备注:通常设置为MIB_TCP_STATE_DELETE_TCB(值为12)用来断开某个TCP连接,这也是唯一可在运行时设置的状态。

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

②Private Declare Function GetTcpTable Lib "" (ByRef pTcpTable As

MIB_TCPTABLE, ByRef pdwSize As Long, ByVal bOrder As Long) As Long

参看 本章第四节 1

2、使用到的类型:

①MIB_TCPTABLE 类型包含Tcp连接表。参看本章第四节 2 ①

②MIB_TCPROW 类型包含了TCP连接信息。参看本章第四节 2 ②

3、使用到的常量:

Const MIB_TCP_STATE_DELETE_TCB = 12 ‘设置断开此Tcp连接

4、主要代码分析:

①定义一个MIB_TCPTABLE类型的变量后直接调用GetTcpTable(参看本章第四节 4 ①)

②使用For„Next循环遍历各个Tcp连接的信息,此时的_Table(i) 将作为设置TCP连接状态的参数依据(参看本章第四节 4 ②)

For i = 0 To _Of_Entries - 1

Print _Table(i).dwLocalAddr & "->" & _Table(i).dwRemoteAddr

Next

③手动输入要删除的TCP连接的序号,设置MIB_TCPROW类型的每一个成员的值

TcpIndex = InputBox("接口号", "Del..")

If TcpIndex = "" Then Exit Sub Else TcpIndex = CLng(TcpIndex)

lAddr = _Table(TcpIndex).dwLocalAddr

lPort = _Table(TcpIndex).dwLocalPort

teAddr = _Table(TcpIndex).dwRemoteAddr

tePort = _Table(TcpIndex).dwRemotePort

e = MIB_TCP_STATE_DELETE_TCB

④调用函数SetTcpEntry断开对应序号的TCP连接,需要注意的是,断开系统的连接,即使调用函数显示成功,但实际并不能断开系统连接。

r = SetTcpEntry(Ttable)

5、运行时截图:

第十八节 在本地电脑的地址解析协议(ARP :Address Resolution Protocol)表中创建和删除一个ARP

1、函数:

①Private Declare Function CreateIpNetEntry Lib "" (pArpEntry As

MIB_IPNETROW) As Long

参数说明:

pArpEntry [输入] 指向一个指定了新接口信息的MIB_IPNETROW类型,调用者必须为这个类型指定所有成员的值。

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

②Private Declare Function DeleteIpNetEntry Lib "" (pArpEntry As

MIB_IPNETROW) As Long

参数说明:

pArpEntry:[输入] 指向一个MIB_IPNETROW类型。这个类型结构指定了要删除的接口。调用者至少要为这个类型指定dwIndex和 dwAddr成员的值。

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

③inet_addr是Winsocket的函数而非””提供的函数,目的是将标准IP地址(””)的字符串转为电脑能识别的长整型的数据。

Private Declare Function inet_addr Lib "" (ByVal cp As String) As Long

参数说明:

cp:[输入] 标准IP地址(””)的字符串

返回值:成功,返回长整型的数据。

2、使用到的类型:

①MIB_IPNETROW 包含地址解析协议(ARP :Address Resolution Protocol)接口信息:

参看 本章 第十节 2 ②

3、使用到的常量:

Const MAXLEN_PHYSADDR = 7

4、主要代码分析:

Dim MI As MIB_IPNETROW

x = 2

= inet_addr(".5") ‘括号内为要设置Arp的IP地址

ddr(0) = 0

ddr(1) = 80

ddr(2) = 80

ddr(3) = 80

ddr(4) = 80

ddr(5) = 80

ddr(6) = 0

ddr(7) = 0

AddrLen = 6

= 3

rvalue = CreateIpNetEntry(MI)

5、运行时截图:

第十九节 Ping一个IP地址

1、函数:

①获得一个Icmp句柄,使ICMP响应能被发出(以下两种声明xp下都可以,但是在2000下要用):

Private Declare Function IcmpCreateFile Lib "" () As Long

Private Declare Function IcmpCreateFile Lib "" () As Long

返回值:成功,返回一个Icmp句柄;失败,返回0。

②发送一条ICMP响应要求, 接着返回回复(以下两种声明xp下都可以,但是在2000下调

用动态链接库):

Private Declare Function IcmpSendEcho Lib "" (ByVal IcmpHandle As Long, ByVal

DestinationAddress As Long, ByVal RequestData As String, ByVal RequestSize As Long, ByVal

RequestOptions As Long, ReplyBuffer As ICMP_ECHO_REPLY, ByVal ReplySize As Long,

ByVal Timeout As Long) As Long

Private Declare Function IcmpSendEcho Lib "" (ByVal IcmpHandle As Long, ByVal

DestinationAddress As Long, ByVal RequestData As String, ByVal RequestSize As Long, ByVal

RequestOptions As Long, ReplyBuffer As ICMP_ECHO_REPLY, ByVal ReplySize As Long,

ByVal Timeout As Long) As Long

参数说明:

IcmpHandle:[输入] 由IcmpCreateFile打开的句柄

DestinationAddress:[输入] 响应要求的目的地

RequestData:[输入] 包含要发送的请求数据中的缓存

RequestSize:[输入] RequestData请求数据缓存的大小,字节

RequestOptions:[输入] 指向IP头请求选项的IP_OPTION_INFORMATION类型的指针,可以为空。

ReplyBuffer:[输出] 用来保存请求响应的缓存。成功,包含一个类型的阵列,缓存应该足够大至少保存一个ICMP_ECHO_REPLY类型加上MAXRequestSize(=8) 字节的数据(一个ICMP错误信息包含8字节数据)。

ReplySize:[输出] ReplyBuffer 的大小,字节

Timeout:[输出] 等待响应时间,毫秒

返回值:成功,返回1,ICMP_ECHO_REPLY类型的数目保存在ReplyBuffer中。每一个响应的状态包含在此类型。如果返回0,调用GetLastError获取更多错误信息。

③关闭一个由IcmpCreateFile获得的Icmp句柄(以下两种声明xp下都可以,但是在2000下要用):

Private Declare Function IcmpCloseHandle Lib "" (ByVal IcmpHandle As Long) As Long

Private Declare Function IcmpCloseHandle Lib "" (ByVal IcmpHandle As Long) As

Long

返回值:成功,返回1。

④Private Declare Function inet_addr Lib "" (ByVal cp As String) As Long

参见本章第十八节 1、 ③

2、使用到的类型:

①ICMP_ECHO_REPLY 描述了回复要求的返回响应的数据

Type ICMP_ECHO_REPLY

address As Long ‘包含正回复的IP地址

Status As Long ‘包含回复的状态(参看后面的常量部分)

RoundTripTime As Long ‘往返时间RTT(毫秒)

DataSize As Integer ‘回复数据大小(字节)

Reserved As Integer ‘保留

ptrData As Long ‘指向回复数据的指针

Options As IP_OPTION_INFORMATION ‘回复选项

Data As String * 250 ‘

End Type

备注:vb和vc关于此类型的声明不一样vb多了Dara成员。

②IP_OPTION_INFORMATION 描述被包含在IP包头部的选项

Type IP_OPTION_INFORMATION

Ttl As Byte ‘生存时间

Tos As Byte ‘服务类型

Flags As Byte ‘IP头标志

OptionsSize As Byte ‘选项数据的大小,字节

OptionsData As Long ‘指向选项数据的指针

End Type

3、使用到的常量:

Const ICMP_SUCCESS = 0

‘成功

Const ICMP_STATUS_BUFFER_TO_SMALL = 11001 '缓存太小

Const ICMP_STATUS_DESTINATION_NET_UNREACH = 11002 '目的地网络不能到达

Const ICMP_STATUS_DESTINATION_HOST_UNREACH = 11003 '目的地主机不能到达

Const ICMP_STATUS_DESTINATION_PROTOCOL_UNREACH = 11004 '目的地协议不能到达

Const ICMP_STATUS_DESTINATION_PORT_UNREACH = 11005 '目的地端口不能到达

Const ICMP_STATUS_NO_RESOURCE = 11006 '没有资源

Const ICMP_STATUS_BAD_OPTION = 11007 '错误选项

Const ICMP_STATUS_HARDWARE_ERROR = 11008 '硬件错误

Const ICMP_STATUS_LARGE_PACKET = 11009 '信息包太大

Const ICMP_STATUS_REQUEST_TIMED_OUT = 11010 '请求超时

Const ICMP_STATUS_BAD_REQUEST = 11011 '错误请求

Const ICMP_STATUS_BAD_ROUTE = 11012 '错误路由

Const ICMP_STATUS_TTL_EXPIRED_TRANSIT = 11013 'TTL终止传输

Const ICMP_STATUS_TTL_EXPIRED_REASSEMBLY = 11014 'TTL终止重新组装

Const ICMP_STATUS_PARAMETER = 11015 '参数有问题

Const ICMP_STATUS_SOURCE_QUENCH = 11016 '资源结束

Const ICMP_STATUS_OPTION_TOO_BIG = 11017 '选项太大

Const ICMP_STATUS_BAD_DESTINATION = 11018 '错误目的地

Const ICMP_STATUS_NEGOTIATING_IPSEC = 11032 '谈判IPSEC

Const ICMP_STATUS_GENERAL_FAILURE = 11050 '常规失败

4、主要代码分析:

①使用函数IcmpCreateFile创建一个Icmp句柄

IcmpHandle = IcmpCreateFile()

②构筑以下参数:定义一个ICMP_ECHO_REPLY类型、目的地IP地址的Long形式、要发送并会返回的数据、数据大小、ICMP_ECHO_REPLY类型的大小、超时设置:

Dim RBuffer As ICMP_ECHO_REPLY

DAddr = inet_addr("") ‘括号内为要Ping的目的地IP地址

RData = "Hi,Hello!"

RequestSize = Len(RData)

ReplySize = Len(RBuffer)

Timeout = 1000

③调用函数IcmpSendEcho:

r = IcmpSendEcho(IcmpHandle, DAddr, RData, RequestSize, 0, RBuffer, ReplySize, Timeout)

Print "状态", IcmpSta()

Print "Ttl",

④关闭由IcmpCreateFile获得的Icmp句柄:

r = IcmpCloseHandle(IcmpHandle)

⑤自定义函数IcmpSta获得Ping状态:

Private Function IcmpSta(icmpStatus As Long) As String

Select Case icmpStatus

Case ICMP_SUCCESS

IcmpSta = "成功"

Case ICMP_STATUS_DESTINATION_HOST_UNREACH

IcmpSta = "目的地主机不能到达"

Case „„ ‘参看本节中常量的说明

……

Case Else

IcmpSta = "错误信息"

End Select

End Function

5、运行时截图:

第二十节 测定到指定目的地往返时间和跳跃数

1、函数:

①Private Declare Function GetRTTAndHopCount Lib "" (ByVal DestIpAddress As

Long, HopCount As Long, MaxHops As Long, RTT As Long) As Long

DestIpAddress :[输入]要测定RTT和跳跃数的目的地IP地址。

HopCount:[输出] 指向一个ULONG变量。这个变量接收由DestIpAddress参数指定的到目的地的跳跃数。

MaxHops:[输入] 寻找目的地的最大跳跃数目。如果跳跃数超过这个数目,函数将终止搜寻并返回FALSE。

RTT:[输出] 到达DestIpAddress指定的目的地的往返时间(Round-trip time),单位毫秒。

返回值:成功返回 1,否则返回0。

②Private Declare Function inet_addr Lib "" (ByVal cp As String) As Long

参见本章第十八节 1、 ③

2、使用到的类型:

3、使用到的常量:

4、主要代码分析:

①设置目标IP地址,要将“”标准格式转换为长整型格式,指定最大跳跃数目,然后直接调用函数GetRTTAndHopCount:

Dip = inet_addr("220.181.27.5") '这里是探测

MaxH = 50

r = GetRTTAndHopCount(Dip, HC, MaxH, RTT)

Print "hopecount", HC

5、运行时截图:

第二十一节 增加和删除一个IP地址

1、函数:

①Private Declare Function AddIPAddress Lib "" ( ByVal Address As Long, ByVal

IpMask As Long, ByVal Ifindex As Long, NTEContext As Long, NTEInstance As Long) As Long

参数说明:

Address:[输入]要增加的IP地址

IpMask:[输入]IP地址的子网掩码

IfIndex:[输入]增加IP地址的适配器,实际值为MIB_(适配器编号).dwIndex

NTEContext:[输出]成功则指向一个与这个IP地址关联的网络表接口(Net Table Entry:NTE)ULONG变量。调用者可以在稍后使用这个关系到调用DeleteIPAddress。

NTEInstance:[输出]成功则指向这个IP地址的网络表接口(Net Table Entry:NTE)实例。

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

备注:①增加的IP是临时的,当系统重新启动或者发生其它的PNP事件的时候这个IP就不存在了,比如将网卡禁用,然后启用,就会发现之前调用函数AddIPAddress增加的的IP地址不存在了。②有时候,调用这个函数,可能造成网络出错、系统Arp映射错误等,但可以禁用启用网卡恢复成正常状态。。

②Private Declare Function DeleteIPAddress Lib "" (ByVal NTEContext As Long) As

Long

参数说明:

NTEContext:[输入] IP地址关联的网络表接口(Net Table Entry:NTE),这个关联是之前用AddIPAddress所创建的,在调用函数GetAdaptersInfo后,从获得的IP_ADAPTER_INFO.

IpAddressList. Context 中也可获得这个参数的值

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

备注:实际上函数DeleteIPAddress只能删除由函数AddIPAddress创建的IP地址。

③Private Declare Function GetIpAddrTable Lib "" (pIpAddrTable As

MIB_IPADDRTABLE, pdwSize As Long, bOrder As Long) As Long

参看本章第九节 1、

④Private Declare Function GetAdaptersInfo Lib "" (IpAdapterInfo As Any,

pOutBufLen As Long) As Long

参看本章第一节 1、

2、使用到的类型:

①MIB_IPADDRTABLE 包含IP地址入口表

参看本章第九节 2、①

②MIB_IPADDRROW 指定特殊IP地址的信息

参看本章第九节 2、②

③IP_ADAPTER_INFO类型:包含本机网络适配器信息。

参看本章第一节 1、①

④IP_ADDR_STRING描述IP 地址链表的节点。

参看本章第一节 1、②