在vb中使用Iphlpapi.dll获取网络信息 第二章 第一节 获取本机网络适配器的信息
2006-12-20 13:05
861 查看
※==================================================================
※本连载文章说明:
※1、连载首发于《软件报》(http://www.sweek.com)2006年21期(2006年5月22日);
※2、此次网上连载采用的是原稿件结构,内容与《软件报》发表略有不同;
※3、谢绝除《软件报》及其相关刊物之外的传统媒体部分或全部转载;
※4、谢绝任何收费媒体、网络转载;
※5、原作者:uruseibest ,blog:http://blog.csdn.net/uruseibest;
※6、如有其它疑问,请联系作者;
※7、如有转载,必须连同本说明一并发表,否则将追究转载者责任。
※======================================================================
第二章 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_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 ‘适配器类型,包含以下类型的适配器(见下表):
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 = AdapterInfo.Next
If pAdapt <> 0 Then
CopyMemory AdapterInfo, ByVal pAdapt, AdapterInfoSize
End If
Loop Until pAdapt = 0
④由每次获得的IP_ADAPTER_INFO类型来获取网络适配器物理地址:
PhysicalAddress = ""
For i = 0 To AdapterInfo.AddressLength - 1
PhysicalAddress = PhysicalAddress & Hex(AdapterInfo.Address(i))
If i < AdapterInfo.AddressLength - 1 Then
PhysicalAddress = PhysicalAddress & "-"
End If
Next
⑤对于属于IP_ADDR_STRING类型的IpAddressList、GatewayList、DhcpServer、PrimaryWinsServer、SecondaryWinsServer,同样要注意IP_ADDR_STRING中Next成员的使用:
Do
CopyMemory IP_ADDR_STRING, AdapterInfo.IpAddressList, LenB(IP_ADDR_STRING)
Print "IP Address: " & IP_ADDR_STRING.IpAddress
Print "Subnet Mask: " & IP_ADDR_STRING.IpMask
pAddrStr = IP_ADDR_STRING.Next
If pAddrStr <> 0 Then
CopyMemory IP_ADDR_STRING.IpAddressList, ByVal pAddrStr, _
LenB(IP_ADDR_STRING.IpAddressList)
End If
Loop Until pAddrStr = 0
5、运行时截图:
※本连载文章说明:
※1、连载首发于《软件报》(http://www.sweek.com)2006年21期(2006年5月22日);
※2、此次网上连载采用的是原稿件结构,内容与《软件报》发表略有不同;
※3、谢绝除《软件报》及其相关刊物之外的传统媒体部分或全部转载;
※4、谢绝任何收费媒体、网络转载;
※5、原作者:uruseibest ,blog:http://blog.csdn.net/uruseibest;
※6、如有其它疑问,请联系作者;
※7、如有转载,必须连同本说明一并发表,否则将追究转载者责任。
※======================================================================
第二章 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_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 | 串行适配器(Serial Line Interface Protocol) |
MIB_IF_TYPE_OTHER | 其他值 | 其他类型的适配器 |
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 = AdapterInfo.Next
If pAdapt <> 0 Then
CopyMemory AdapterInfo, ByVal pAdapt, AdapterInfoSize
End If
Loop Until pAdapt = 0
④由每次获得的IP_ADAPTER_INFO类型来获取网络适配器物理地址:
PhysicalAddress = ""
For i = 0 To AdapterInfo.AddressLength - 1
PhysicalAddress = PhysicalAddress & Hex(AdapterInfo.Address(i))
If i < AdapterInfo.AddressLength - 1 Then
PhysicalAddress = PhysicalAddress & "-"
End If
Next
⑤对于属于IP_ADDR_STRING类型的IpAddressList、GatewayList、DhcpServer、PrimaryWinsServer、SecondaryWinsServer,同样要注意IP_ADDR_STRING中Next成员的使用:
Do
CopyMemory IP_ADDR_STRING, AdapterInfo.IpAddressList, LenB(IP_ADDR_STRING)
Print "IP Address: " & IP_ADDR_STRING.IpAddress
Print "Subnet Mask: " & IP_ADDR_STRING.IpMask
pAddrStr = IP_ADDR_STRING.Next
If pAddrStr <> 0 Then
CopyMemory IP_ADDR_STRING.IpAddressList, ByVal pAddrStr, _
LenB(IP_ADDR_STRING.IpAddressList)
End If
Loop Until pAddrStr = 0
5、运行时截图:
相关文章推荐
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第一节 获取本机网络适配器的信息
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第十二节 获得本机系统网络接口适配器的列表
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第十二节 获得本机系统网络接口适配器的列表
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第五节 获取本机UDP信息列表
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第十一节 获取当前计算机的IP信息
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第十四节 返回本机网络接口数量
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第二十一节 增加和删除一个IP地址
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第七节 获取本机网间控制报文协议(ICMP)信息
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第十五节 设置本机默认的生存时间(time-to-live:TTL)值
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第六节 获取当前UDP连接情况
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第十五节 设置本机默认的生存时间(time-to-live:TTL)值
- 在vb中使用Iphlpapi.dll获取网络信息 第三章 第一节 IPHLPAPI 的其它函数
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第八节 获取本机网络参数
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第十六节 获取本机IP 路由表
- 在vb中使用Iphlpapi.dll获取网络信息 第四章 第一节 错误代码
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第十六节 获取本机IP 路由表
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第二节 获取MIB-II 接口表
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第九节 获取网卡–IP地址映射表
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第十七节 设置TCP连接状态
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第十七节 设置TCP连接状态