※==================================================================
※本连载文章说明:
※1、连载首发于《软件报》(http://www.sweek.com)2006年21期(2006年5月22日);
※2、此次网上连载采用的是原稿件结构,内容与《软件报》发表略有不同;
※3、谢绝除《软件报》及其相关刊物之外的传统媒体部分或全部转载;
※4、谢绝任何收费媒体、网络转载;
※5、原作者:uruseibest ,blog:http://blog.csdn.net/uruseibest;
※6、如有其它疑问,请联系作者;
※7、如有转载,必须连同本说明一并发表,否则将追究转载者责任。
※======================================================================
第八节 获取本机网络参数
1、函数:
Private Declare Function GetNetworkParams Lib "IPHlpApi.dll" (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", FixedInfo.HostName
③采用Do循环来获取所有DNS服务器地址:
Print "DnsServer IP", FixedInfo.DnsServerList.IpAddress
pAddrStr = FixedInfo.DnsServerList.Next
Do While pAddrStr <> 0
CopyMemory IPAS, ByVal pAddrStr, LenB(IPAS)
Print "DNSServer IP", IPAS.IpAddress
pAddrStr = IPAS.Next
Loop
5、运行时截图: