在vb中使用Iphlpapi.dll获取网络信息 第二章 第八节 获取本机网络参数

来源:互联网 发布:淘宝的nmd都是真货吗 编辑:程序博客网 时间:2024/05/21 12:39

※==================================================================
※本连载文章说明:
※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                         Mixedm节点NetBIOS名字解析法

8         HYBRID_NODETYPE                      Hybridh节点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、运行时截图: