在vb中使用Iphlpapi.dll获取网络信息(下)

这篇博客详细介绍了如何在Visual Basic中使用Iphlpapi.dll动态链接库获取网络信息,包括获取网络接口数量、设置IP生存时间、获取IP路由表、设置TCP连接状态、创建和删除ARP、执行Ping操作等。通过实例代码展示了函数的使用方法,帮助开发者更好地理解和应用Iphlpapi.dll。
摘要由CSDN通过智能技术生成

(转上版)http://miaozk2006.blog.163.com/blog/static/382470582011111391326440/

5、运行时截图:
第十四节 返回本机网络接口数量

1、函数:

Private Declare Function GetNumberOfInterfaces Lib "iphlpapi.dll" (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 "iphlpapi.dll" (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 "iphlpapi.dll" (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 mIF.dwNumEntries - 1

           Realip = inversaip(mIF.table(i).dwForwardDest)

           RealMask = inversaip(mIF.table(i).dwForwardMask)

           Print "ip", Realip

           Print "mask", RealMask

Next

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

Private Function inversaip(IPAddrLng As Long) As String

       ‘同本章第九节 4  ③

End Function

 

5、运行时截图:

 

第十七节 设置TCP连接状态

1、函数:

①Private Declare Function SetTcpEntry Lib "iphlpapi.dll" (pTcpTable As MIB_TCPROW) As Long

参数说明:

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

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

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

 

②Private Declare Function GetTcpTable Lib "iphlpapi.dll" (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连接的信息,此时的mtcp.TCP_Table(i) 将作为设置TCP连接状态的参数依据(参看本章第四节 4  ②)

For i = 0 To mtcp.dwNum_Of_Entries - 1

Print  mtcp.TCP_Table(i).dwLocalAddr & "->" & mtcp.TCP_Table(i).dwRemoteAddr

Next

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

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

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

Ttable.dwLocalAddr = mtcp.TCP_Table(TcpIndex).dwLocalAddr

Ttable.dwLocalPort = mtcp.TCP_Table(TcpIndex).dwLocalPort

Ttable.dwRemoteAddr = mtcp.TCP_Table(TcpIndex).dwRemoteAddr

Ttable.dwRemotePort = mtcp.TCP_Table(TcpIndex).dwRemotePort

Ttable.dwState = MIB_TCP_STATE_DELETE_TCB

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

r = SetTcpEntry(Ttable)

 

5、运行时截图:

 

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

1、函数:

①Private Declare Function CreateIpNetEntry Lib "iphlpapi.dll" (pArpEntry As MIB_IPNETROW) As Long

参数说明:

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

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

 

②Private Declare Function DeleteIpNetEntry Lib "iphlpapi.dll" (pArpEntry As MIB_IPNETROW) As Long

参数说明:

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

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

 

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

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

参数说明:

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

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

 

2、使用到的类型:

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

参看 本章 第十节 2 ②

 

3、使用到的常量:

Const MAXLEN_PHYSADDR = 7

 

4、主要代码分析:

Dim MI As MIB_IPNETROW

 

MI.dwIndex = 2

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

MI.bPhysAddr(0) = 0

MI.bPhysAddr(1) = 80

MI.bPhysAddr(2) = 80

MI.bPhysAddr(3) = 80

MI.bPhysAddr(4) = 80

MI.bPhysAddr(5) = 80

MI.bPhysAddr(6) = 0

MI.bPhysAddr(7) = 0

MI.dwPhysAddrLen = 6

MI.dwType = 3

 

rvalue = CreateIpNetEntry(MI)

 

5、运行时截图:

第十九节 Ping一个IP地址

1、函数:

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

Private Declare Function IcmpCreateFile Lib "iphlpapi.dll" () As Long

Private Declare Function IcmpCreateFile Lib "icmp.dll" () As Long

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

 

②发送一条ICMP响应要求, 接着返回回复(以下两种声明xp下都可以,但是在2000下调用动态链接库icmp.dll):

Private Declare Function IcmpSendEcho Lib "icmp.dll" (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 "iphlpapi.dll" (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下要用icmp.dll):

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

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

返回值:成功,返回1。

 

④Private Declare Function inet_addr Lib "wsock32.dll" (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 =

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值