在vb中使用Iphlpapi.dll获取网络信息 第二章 第一节 获取本机网络适配器的信息

※==================================================================
※本连载文章说明:
※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

其他值

其他类型的适配器

     

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         是否启用WINSWindows 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地址标识,符合AddIPAddressDeleteIPAddress函数中的网络接口关联参数。

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类型的IpAddressListGatewayListDhcpServerPrimaryWinsServerSecondaryWinsServer,同样要注意IP_ADDR_STRINGNext成员的使用:

    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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
packetvbvb类,封装了 winpcapa, vbpcap又称为PacketVB,是一种能够被VB调用的数据包捕获开发库,vbpcap封装了WinPcap的API函数的ActiveX库,由Politecnico di Torino开发,使用方法与WinPcap下的Packet.dll关系密切。因此在使用vbpcap编程的时候,应该首先安装WinPcap vbpcap把捕获到的网络数据包存放在内部的一个缓冲器,解析每个数据包。当每捕获一个数据包时,会触发一个事件,通过该事件,传递被捕获数据包的字节数。然后可以调用vbpcap提供的方法,把捕获到的数据包从内部缓冲器copy到一个2进制数组。 目前的vbpcap只能做到捕获数据包,没有对捕获到的数据包进行协议分析,协议分析的工作可以由程序设计者来完成。另外,由于vbpcap是封装的WinPcap的API函数,因此和WinPcap一样,只能捕获数据包,并不能阻止数据包在网络上的传递,因此不能用来开发防火墙一类的程序。 在使用vbpcap编写捕获数据包程序之前,应先最好准备工作,可以参考如下步骤来进行: 1.首先安装2.3-WinPcap本(废话~~~),注意,一定要安装该本的winpcap,否则注册vbpcap.dll时会出错(还不知道原因)。 2.解压缩packetvb-1.0.0.3.bin.zip,把其vbpcap.dll拷贝到c:\windows\system32目录下 3.“开始”-->“运行”,输入“regsvr32 c:\windows\system32\vbpcap.dll”,注册vbpcap.dll 4.打开VB,“工程”-->“引用”-->“浏览”,在c:\windows\system32vbpcap.dll,确定 5.下面就可以使用vbpcap.dll来编写网络抓包程序了

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值