




已阅读5页,还剩67页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在 vb 中使用 Iphlpapi dll 获取网络信息 第一章第一章 前言前言 Windows 98 以上的操作系统在系统目录下都带有 iphlpapi dll 这个动态链接库文件 它 可以帮助程序员方便地获取计算机网络信息 对于 C 程序员来说 只要有 iphlpapi 的头文 件 调用 iphlpapi dll 是很简单的事 但是对于 Vb 程序员则是比较困难的问题 本文将就 Vb 中调用 iphlpapi dll 来介绍 iphlpapi 的使用 第二章第二章 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 串行适配器 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 是否启用 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 Left Hex Maca 0 2 AdapterName 输入 指定了适配器名称的 Unicode 字符串 IfIndex 输出 指向一个指向适配器序号的 ULONG 变量指针 返回值 成功 返回 0 失败 返回错误代码 2 GetAdaptersAddresses 返回和适配器关联的地址 DWORD WINAPI GetAdaptersAddresses ULONG Family DWORD Flags PVOID Reserved PIP ADAPTER ADDRESSES pAdapterAddresses PULONG pOutBufLen Family 输入 获得地址族 必须是以下值之一 AF INET 仅返回 IPv4 地址 AF INET6 仅返回 IPv6 地址 AF UNSPEC 从所有的地址族返回地址 Flags 输入 返回地址类型 这个参数为 0 或是以下值的联合值 GAA FLAG INCLUDE PREFIX 返回 IPv6 地址前缀 GAA FLAG SKIP UNICAST 不返回 unicast 地址 GAA FLAG SKIP ANYCAST 不返回 anycast 地址 GAA FLAG SKIP FRIENDLY NAME 不返回适配器的友好名称 GAA FLAG SKIP MULTICAST 不返回多点传送 multicast 地址 GAA FLAG SKIP DNS SERVER 不返回 DNS 服务器地址 Reserved 输入 调用程序必须将此参数置为 NULL pAdapterAddresses 输入 输出 指向一段 IP ADAPTER ADDRESSES 缓存 成 功的话 该缓存包含地址信息 pOutBufLen 输出 返回 pAdapterAddresses 所在缓存的大小 返回值 成功 返回 0 失败 返回错误代码 3 GetPerAdapterInfo 返回与适配器相应的指定接口的信息 DWORD GetPerAdapterInfo ULONG IfIndex PIP PER ADAPTER INFO pPerAdapterInfo PULONG pOutBufLen IfIndex 输入 一个接口的序号 函数将返回与这个序号相应的适配器接口信息 pPerAdapterInfo 输出 指向一个接收适配器信息的 IP PER ADAPTER INFO 类型 pOutBufLen 输入 指向一个指定了 IP PER ADAPTER INFO 类型 ULONG 变量 如果指 定的大小不够大 将设置为须要的大小并返回 ERROR BUFFER OVERFLOW 错误 返回值 成功 返回 0 失败 返回错误代码 备注 个人觉得实际使用时候 获取 IfIndex 比较困难 不如用 GetAdaptersInfo 4 GetUniDirectionalAdapterInfo 接收本机安装的单向适配器的信息 DWORD GetUniDirectionalAdapterInfo PIP UNIDIRECTIONAL ADAPTER ADDRESS pIPIfInfo PULONG dwOutBufLen pIPIfInfo 输出 指向一个接收本机已安装的单向适配器的信息的 IP UNIDIRECTIONAL ADAPTER ADDRESS 类型 dwOutBufLen 输出 指向一个 ULONG 变量用来保存 pIPIfInfo 参数缓存的大小 返回值 成功 返回 0 失败 返回错误代码 5 CreateProxyArpEntry 为本地电脑指定的 IP 地址创建一个代理服务器地址解析协议 Proxy Address Resolution Protocol PARP 接口 DWORD CreateProxyArpEntry DWORD dwAddress DWORD dwMask DWORD dwIfIndex dwAddress 输入 作为代理服务器的电脑的 IP 地址 dwMask 输入 指定了 dwAddress 的 IP 地址对应的子网掩码 dwIfIndex 输入 代理服务地址解析协议 ARP 接口的索引通过 dwAddress 识别 IP 地址 换句话说 当 dwAddress 一个地址解析协议 ARP 请求在这个接口上被收到的时候 本 地电脑的物理地址的接口作出响应 如果接口类型不支持地址解析协议 ARP 比如 端 对端协议 PPP 那么调用失败 返回值 成功 返回 0 失败 返回错误代码 6 DeleteProxyArpEntry 删除由 dwAddress 和 dwIfIndex 参数指定的 PARP 接口 DWORD DeleteProxyArpEntry DWORD dwAddress DWORD dwMask DWORD dwIfIndex dwAddress 输入 作为代理服务器的电脑的 IP 地址 dwMask 输入 对应 dwAddress 的子网掩码 dwIfIndex 输入 对应 IP 地址 dwAddress 指定的支持代理服务器地址解析协议 Proxy Address Resolution Protocol PARP 的电脑的接口序号 返回值 成功 返回 0 失败 返回错误代码 7 FlushIpNetTable 从 ARP 表中删除指定接口的 ARP 接口 DWORD FlushIpNetTable DWORD dwIfIndex dwIfIndex 输入 将要删除的 ARP 接口的序号 返回值 成功 返回 0 失败 返回错误代码 8 GetFriendlyIfIndex 获得一个接口序号并返回一个反向兼容的接口序号 DWORD GetFriendlyIfIndex DWORD IfIndex IfIndex 输入 来自反向兼容或者 友好 的接口序号 返回值 成功 返回 0 失败 返回错误代码 9 GetIfEntry 返回指定接口的信息 DWORD GetIfEntry PMIB IFROW pIfRow pIfRow 输入 输出 成功返回一个指向本机接口信息的 MIB IFROW 类型 输出 需设 置 MIB IFROW 的 dwIndex 为想要获取信息的接口的序号 返回值 成功 返回 0 失败 返回错误代码 10 SetIfEntry 设置一个接口的管理状态 DWORD SetIfEntry PMIB IFROW pIfRow pIfRow 输入 指向一个 MIB IFROW 类型 dwIndex 成员指定了要设置管理状态的接口 dwAdminStatus 成员指定了新的管理状态 为以下值之一 MIB IF ADMIN STATUS UP 接口可被管理 MIB IF ADMIN STATUS DOWN 接口不能被管理 返回值 成功 返回 0 失败 返回错误代码 11 GetIcmpStatisticsEx 返回本机 IPv4 ICMP 或 IPv6 ICMP 统计表 DWORD GetIcmpStatisticsEx PMIB ICMP EX pStats DWORD dwFamily pStats 输出 指向一个本机收到 ICMP 统计表的 MIB ICMP 类型 dwFamily 输入 返回 ICMP 统计表的协议族 必须数以下值 AF INET Internet Protocol version 4 IPv4 AF INET6 Internet Protocol version 6 IPv6 返回值 成功 返回 0 失败 返回错误代码 12 GetIpStatisticsEx 返回 IP 统计表并支持 IPv6 协议族 DWORD GetIpStatisticsEx PMIB IPSTATS pStats DWORD dwFamily pStats 输出 指向一个收到本机 IP 统计表的 MIB IPSTATS 类型 dwFamily 输入 协议族 以下值之一 AF INET Internet Protocol version 4 IPv4 AF INET6 Internet Protocol version 6 IPv6 返回值 成功 返回 0 失败 返回错误代码 13 Icmp6CreateFile 打开一个句柄 使 IPv6 的 ICMP 回应请求能被发出 HANDLE Icmp6CreateFile void 返回值 成功 返回一个句柄 失败 返回 0 14 IcmpParseReplies 解析提供的响应缓存 返回 ICMP 响应创建数目 DWORD IcmpParseReplies LPVOID ReplyBuffer DWORD ReplySize ReplyBuffer 输入 被 IcmpSendEcho2 传递的缓存 它被重写来保留 ICMP ECHO REPLY 类型的阵列 它的类型为 PICMP ECHO REPLY ReplySize 输入 ReplyBuffer 的大小 返回值 成功 返回 ICMP 响应创建的数目 失败 返回 0 备注 此函数不能被用于之前传递给 IcmpSendEcho 的响应缓存 IcmpSendEcho 在返回给 使用者前解析那些缓存 仅和 IcmpSendEcho2 一起使用此函数 15 Icmp6ParseReplies 分析被供给答复的缓存 返回 IPv6 ICMP 数字响应发现 DWORD Icmp6ParseReplies LPVOID ReplyBuffer DWORD ReplySize ReplyBuffer 输入 传给 Icmp6SendEcho2 的缓存 是被重写用来保留 ICMP ECHO REPLY 类型的阵列 它的类型是 PICMP ECHO REPLY ReplySize 输入 ReplyBuffer 的大小 返回值 成功 返回 IPv6 ICMP 响应创建的数目 失败 返回 0 16 IcmpSendEcho2 发送一个 IPv6 ICMP Echo 要求并立即返回或者超时返回 DWORD IcmpSendEcho2 HANDLE IcmpHandle HANDLE Event FARPROC ApcRoutine PVOID ApcContext IPAddr DestinationAddress LPVOID RequestData WORD RequestSize PIP OPTION INFORMATION RequestOptions LPVOID ReplyBuffer DWORD ReplySize DWORD Timeout IcmpHandle 输入 由 IcmpCreateFile 打开的句柄 Event 输入 用来标志无论何时 ICMP 响应到达的事件 ApcRoutine 输入 被调用的程序当前正调用线程在一个警告线程 alertable thread 中并 且一个 ICMP 回复到达 ApcContext 输入 当 IcmpSendEcho2 成功调用后用于 ApcRoutine 的可选参数 DestinationAddress 输入 响应要求的目的地 RequestData 输入 包含于请求中要发送的数据的缓存 RequestSize 输入 requestdata 缓存的大小 字节 RequestOptions 输入 指向请求的 IP 头选项的 IP OPTION INFORMATION 类型的指针 可为空 ReplyBuffer 输出 保存请求响应得缓存 成功调用 缓存包含一个跟随选项和数据的 ICMP ECHO REPLY 类型的阵列 缓存必须足够大来保存至少一个 ICMP ECHO REPLY 类型 它必须足够大至少保存 9 个或更多字节的数据 ReplySize 输出 replybuffer 的大小 字节 Timeout 输出 等待回应时间 毫秒 返回值 成功 返回收到储存在 ReplyBuffer 中的回应的数目 失败 返回 0 备注 当使用异步 ApcRoutine 或者 Event 被指定 ReplyBuffer 和 ReplySize 必须同意 响应 ICMP 响应数据被拷贝到 ReplyBuffer 函数调用者必须使用 IcmpParseReplies 解析 异步 IPv6 使用 Icmp6SendEcho2 和 Icmp6ParseReplies 对于 Windows 95 98 Me 参数 Event ApcRoutine ApcContext 被忽略 17 SetIpStatistics 启用或者禁止转发 IP 包或设置本机 TTL 值 DWORD SetIpStatistics PMIB IPSTATS pIpStats pIpStats 输入 指向一个 MIB IPSTATS 类型 调用者应该为此类型的 dwForwarding 和 dwDefaultTTL 成员设置新值 保持某个成员的值 使用 MIB USE CURRENT TTL 或者 MIB USE CURRENT FORWARDING 返回值 成功 返回 0 失败 返回错误代码 备注 在实际使用中 好像只能设置 TTL 的值 别的值设置有可能导致错误 87 参数 错误 或者虽然调用成功 但是并没有达到预期那样设置成功 设置默认的生存时间 TTL 也可以使用 SetIpTTL 函数 18 IpReleaseAddress 释放一个之前通过 DHCP 获得的 IP 地址 DWORD IpReleaseAddress PIP ADAPTER INDEX MAP AdapterInfo AdapterInfo 输入 指向一个 IP ADAPTER INDEX MAP 类型 指定了要释放的和 IP 地 址关联的适配器 返回值 成功 返回 0 失败 返回错误代码 19 IpRenewAddress 更新一个之前通过 DHCP 获得的 IP 地址租期 DWORD IpRenewAddress PIP ADAPTER INDEX MAP AdapterInfo AdapterInfo 输入 指向一个 IP ADAPTER INDEX MAP 类型 指定了与适配器关联的 IP 地址更新 返回值 成功 返回 0 失败 返回错误代码 20 NotifyAddrChange 当 IP 地址到接口的映射表发生改变 将引发一个通知 DWORD NotifyAddrChange PHANDLE Handle LPOVERLAPPED overlapped Handle 输出 指向一个 HANDLE 变量 用来接收一个句柄 handle 使用到异步通知中 警告 不能关掉这个句柄 overlapped 输入 指向一个 OVERLAPPED 类型 通知调用者任何 IP 地址到接口的映射表 改变 返回值 成功 如果调用者指定 Handle 和 overlapped 参数为空 返回 NO ERROR 如果 调用者指定非空参数 返回 ERROR IO PENDING 失败 使用 FormatMessage 获取错误 信息 备注 如果调用者指定 Handle 和 overlapped 参数为空 对 NotifyAddrChange 的调用将会 被阻止直到一个 IP 地址改变发生 调用者指定了一个 handle 变量和一个 OVERLAPPED 类型 调用者可以使用返回的 handle 以及 OVERLAPPED 类型来接收路由表改变的异步通知 21 NotifyRouteChange IP 路由表发生改变将引起一个通知 DWORD NotifyRouteChange PHANDLE Handle LPOVERLAPPED overlapped Handle 输出 指向一个 HANDLE 变量 此变量接收一个用作异步通知的句柄 overlapped 输入 指向一个 OVERLAPPED 类型 此类型通知调用者路由表的每一个改变 返回值 成功 如果调用者指定 Handle 和 overlapped 参数为空 返回 NO ERROR 如果 调用者指定非空参数 返回 ERROR IO PENDING 失败 使用 FormatMessage 获取错误 信息 备注 如果调用者指定 Handle 和 overlapped 参数为空 对 NotifyRouteChange 的调用将 会被阻止直到一个路由表改变发生 调用者指定了一个 handle 变量和一个 OVERLAPPED 类型 调用者可以使用返回的 handle 以及 OVERLAPPED 类型来接收路由表改变的异步通知 22 CreateIpForwardEntry 创建一个路由到本地电脑 IP 路由表 DWORD CreateIpForwardEntry PMIB IPFORWARDROW pRoute pRoute 输入 指向指定了新路由信息的 MIB IPFORWARDROW 类型的指针 调用者必 须指定这个类型的所有成员值 必须指定 PROTO IP NETMGMT 作为 MIB IPFORWARDROW 类型中 dwForwardProto 成员的值 返回值 成功 返回 0 失败 返回错误代码 备注 修改现有的路由表中的路由 使用 SetIpForwardEntry 函数 调用者不能指定路由协议 例如 PROTO IP OSPF 作为 MIB IPFORWARDROW 类型 的 dwForwardProto 成员的值 路由协议标识符仅仅用来识别通过路由表接收到的路由信息 例如 PROTO IP OSPF 被用来识别通过 OSPF 路由表接收到的路由信息 MIB IPFORWARDROW 类型中的 dwForwardPolicy 成员在当前未使用 调用者应该将它 设置为 0 MIB IPFORWARDROW 类型中的 DwForwardAge 成员仅仅用来当路由和远程数据服务 Remote Access Service RRAS 正在运行 并且仅用于路由的 PROTO IP NETMGMT 类型 这个函数执行了一个特许操作 需要有必须的权限才能执行 23 DeleteIpForwardEntry 从本地电脑的 IP 路由表中删除一个路由 DWORD DeleteIpForwardEntry PMIB IPFORWARDROW pRoute pRoute 输入 指向一个 MIB IPFORWARDROW 类型 这个类型指定了识别将 要删除的路由的信息 调用者必须指定类型中以下成员的值 dwForwardIfIndex dwForwardDest dwForwardMask dwForwardNextHop dwForwardPoli cy 返回值 成功 返回 0 失败 返回错误代码 备注 MIB IPFORWARDROW 类型是 GetIpForwardTable 返回的 接下来 再将此类型 投递给 DeleteForwardEntry 函数 便可删除指定的路由条目了 MIB IPFORWARDROW 类型的 dwForwardPolicy 目前未使用 应该设置为 0 24 EnableRouter 增加涉及的 enable IP forwarding 要求的数目 DWORD WINAPI EnableRouter HANDLE pHandle OVERLAPPED pOverlapped pHandle 指向一个句柄 pOverlapped 指向一个 OVERLAPPED 类型 除了 hEvent 成员 类型中的其它成员必须设 置为 0 hEvent 成员应该包含一个有效的事件对象的句柄 使用 CreateEvent 函数来创建这 个事件对象 返回值 成功 返回 ERROR IO PENDING 失败 调用 FormatMessage 获取更多错误信 息 25 GetBestInterface 返回包含到指定 IP 地址的最佳路由接口序号 DWORD GetBestInterface IPAddr dwDestAddr PDWORD pdwBestIfIndex dwDestAddr 输入 目标 IP 地址 pdwBestIfIndex 输出 指向一个包含到指定 IP 地址的最佳路由接口序号的 DWORD 变量 返回值 成功 返回 0 失败 返回错误代码 26 GetBestInterfaceEx 返回包含到指定 IPv4 或 IPv6 地址的最佳路由接口序号 DWORD GetBestInterface struct sockaddr pDestAddr PDWORD pdwBestIfIndex dwDestAddr 输入 目标 IP 地址 包含了一个 sockaddr 类型 pdwBestIfIndex 输出 指向一个包含到指定 IP 地址的最佳路由接口序号的 DWORD 变量 返回值 成功 返回 0 失败 返回错误代码 27 GetBestRoute 返回包含到指定 IP 地址的最佳路由 DWORD GetBestRoute DWORD dwDestAddr DWORD dwSourceAddr PMIB IPFORWARDROW pBestRoute dwDestAddr 输入 目标 IP 地址 dwSourceAddr 输入 源 IP 地址 这个 Ip 地址是本地电脑上相应的接口 如果有多个最佳 路由存在 函数选择使用这个接口的路由 这个参数是可选的 调用者可以指定这个参数 为 0 pBestRoute 输出 指向一个包含了最佳路由的 MIB IPFORWARDROW 类型 返回值 成功 返回 0 失败 返回错误代码 28 SetIpForwardEntry 从本机 IP 路由表中修改一个现有的路由 DWORD SetIpForwardEntry PMIB IPFORWARDROW pRoute pRoute 输入 指向一个为现有路由指定了新信息的 MIB IPFORWARDROW 类型 调用 者必须将此类型的 dwForwardProto 设置为 PROTO IP NETMGMT 调用者同样必须指定 该类型中以下成员的值 dwForwardIfIndex dwForwardDest dwForwardMask dwForwardNextHop dwForwardPoli cy 返回值 成功 返回 0 失败 返回错误代码 备注 在 IP 路由表中创建一个新的路由 使用 CreateIpForwardEntry 函数 调用者不能指定一个路由协议 比如 不能将 MIB IPFORWARDROW 的 dwForwardProto 设置为 PROTO IP OSPF 路由协议标识符 id 是用来标识通过指定的 路由协议收到的路由信息 例如 PROTO IP OSPF 是用来标识通过 OSPF 路有协议收到 的路由信息 MIB IPFORWARDROW 类型中的 dwForwardPolicy 成员目前没有使用 指定为 0 29 UnenableRouter 减少涉及的 enable IP forwarding 要求数目 DWORD WINAPI UnenableRouter OVERLAPPED pOverlapped LPDWORD lpdwEnableCount pOverlapped 指向一个 OVERLAPPED 类型 此类型必须和对 EnableRouter 的调用一样 lpdwEnableCount out optional 指向接收涉及剩余数目的 DWORD 变量 备注 如果调用 EnableRouter 的进程没有调用 UnenableRouter 而终止 系统会减少 IP 推进 涉及的数目就象调用了 UnenableRouter 一样 调用 UnenableRouter 后 使用 CloseHandle 来关闭 OVERLAPPED 类型中的事件对象的句柄 返回值 成功 返回 0 失败 返回错误代码 30 GetTcpStatisticsEx 返回本机 TCP 统计表并支持 IPv6 协议族 DWORD GetTcpStatisticsEx PMIB TCPSTATS pStats DWORD dwFamily pStats 输出 指向一个接收本机 TCP 统计表的 MIB TCPSTATS 类型 dwFamily 输入 接收的统计表的协议族 为以下参数之一 AF INET Internet Protocol version 4 IPv4 AF INET6 Internet Protocol version 6 IPv6 返回值 成功 返回 0 失败 返回错误代码 31 GetUdpStatisticsEx 返回本机 UDP 统计表并支持 IPv6 协议族 DWORD GetUdpStatisticsEx PMIB UDPSTATS pStats DWORD dwFamily pStats 输出 指向一个接收到本机 UDP 统计表的 MIB UDPSTATS 类型 dwFamily 输入 接收的统计表的协议族 为以下参数之一 AF INET Internet Protocol version 4 IPv4 AF INET6 Internet Protocol version 6 IPv6 返回值 成功 返回 0 失败 返回错误代码 第二节 从 C 原型到 Vb 声明 1 Vb 程序员为什么要了解 C 原型 很简单 因为无论 MSDN 还是网上所提供的资料大部分都是针对 C 语言的 我们要在 Vb 中使用这些资料 就需要我们将其从 C 翻译到 Vb 的 2 如何实现 C 原型到 Vb 声明 重要的一点就是必须了解各种类型在内存中所占的实际字节长度 比如 C 中 DWORD 型占用 4 个字节 Vb 中相应的占用同样 4 字节长度的就是 Long 型 因为这篇文章是介绍 Iphlpapi 的 因此这里将不会介绍从 C 原型到 Vb 声明的详细过程 请参考相应的书籍资料 3 从 C 原型到 Vb 声明的一个例子 使用函数 SetIpStatistics 来设置本机 TTL 值 C 原型 DWORD SetIpStatistics PMIB IPSTATS pIpStats Vb 声明 Private Declare Function SetIpStatistics Lib iphlpapi dll pIpStats As MIB IPSTATS As Long 程序代码 Dim ips As MIB IPSTATS ips dwDefaultTTL 63 r SetIpStatistics ips 运行结果 第四章第四章 第一节 错误代码 在 Iphlpapi 中调用函数常常是返回 0 表示调用成功 否则将返回错误代码 这里列举了部 分常见的错误代码 代码 说明 31 连接到系统的一个设备不能正常运转 50 此函数不被本机系统支持 55 指定的网络资源或设备不可用 如在只有一个网卡的机 器上试图读取第二块网卡 87 无效的参数 通常是进行 API 调用时传递了错误的参 数 111 缓冲区溢出 122 缓冲区不是足够大 232 无数据 第二节 一个重要函数 在本文所列举的代码中 有一个十分重要的函数 CopyMemory 它简化了内存数据块 间的拷贝 但是如果用的不当的话 比如对不可读写的内存块进行读写 则会出现致命的 错误 Private Declare Sub CopyMemory Lib kernel32 Alias RtlMoveMemory Destination As Any Source As Any ByVal Length As Long 参数说明 Destination 目标地址 Source 源地址 Length 要拷贝数据的长度 实例代码 Dim a 9 As Long b 9 As Long For i 0 To 9 a i i b i 0 Next CopyMemory b 0 a 0 10 4 将数组 a 的值拷贝到数组 b 运行时截图 第三节 实例一 网络数据流量图 在第二章第二节介绍了 GetIfTable 函数 通过这个函数可以获得总共收到和发出的数 据字节数等信息 比较前后两次总共收到与发出的数据大小以及之间的时间 就可以获得 当前网络传输数据的速率 1 程序设置 一个 Picture 控件 width 5000 height 2000 Picture 控件中设置一个 Shape 控件 index 0 背景色为红色 一个 Timer 控件 Interval 1000 两个按钮 caption 分别为 开始 停止 其余为 Label 控件 记录当前接收的数据字节 当前发送的数据字节 当前的传输速率 最大传输速率 2 程序思路 设置 Timer Interval 1000 每隔一秒调用一次函数 GetIfTable 获取一次数据 前后两次数 据的差就是一秒内传输数据的大小 使用一组 Shape 控件构成柱状图来表示当前的数据流 量 设置 Picture 的宽度为 5000 相应的设置 Shape 控件的宽度为 100 这样可以在图上显 示 50 个 shape 控件 表示了 50 秒的网络数据流量状况 Shape 控件的高度为当前网络数据 流量大小 1 1k 此程序中最大显示为 2M 3 主要代码 函数 类型说明请参看第二章第二节 公用变量 Dim TotelRecv As Long 当前接收的数据字节 Dim TotelSend As Long 当前发送的数据字节 Dim LastRecv As Long 之前接收的数据字节 Dim LastSend As Long 之前发送的数据字节 Dim CurStream As Double 当前的传输速率 Dim MaxStream As Double 最大传输速率 Dim NewArray 49 As Long Shape 控件的高度 窗体载入时 Timer1 Enabled False 不允许 Timer 控件运行 LastRecv 0 LastSend 0 设置之前接收 发送的数据字节 CurStream 0 MaxStream 0 设置当前的传输速率 最大传输速率 For i 0 To 49 设置 Shape 控件的初始高度 NewArray i 0 Next For i 1 To 49 载入 Shape 控件 Load Shape i Next For i 0 To 49 设置 Shape 控件 Shape i Width 100 宽度 Shape i Height NewArray i 高度 Shape i Top 2000 NewArray i 与容器顶端的距离 Shape i Left 49 i 100 与容器左端的距离 Shape i Visible True 可见 Next 按下 开始 按钮 TotelRecv 0 TotelSend 0 设置当前接收 发送的数据字节 LenIfT Len ifT rvalue GetIfTable ifT LenIfT True 调用函数 GetIfTable For i 0 To ifT dwNumEntries 1 枚举每个网卡 If ifT MIB Table i dwType 6 Then 只对以太网卡类型进行统计 TotelRecv TotelRecv ifT MIB Table i dwInOctets 当前接收的数据字节 TotelSend TotelSend ifT MIB Table i dwOutOctets 当前发送的数据字节 End If Next CurStream Format CDbl TotelRecv TotelSend LastRecv LastSend CDbl 1024 0000 00 当前流量为当前接收和发送数据大小减去之前接收和发送数据大小 这里获得的实际仅为当前接收和发送数据大小 不显示 LastRecv TotelRecv LastSend TotelSend 设置之前接收 发送的数据字节 Timer1 Enabled True 允许 Timer 控件运行 开始正式进行数据统计 Command1 Enabled False Command2 Enabled True Timer 控件启动 TotelRecv 0 TotelSend 0 LenIfT Len ifT rvalue GetIfTable ifT LenIfT True For i 0 To ifT dwNumEntries 1 If ifT MIB Table i dwType 6 Then TotelRecv TotelRecv ifT MIB Table i dwInOctets TotelSend TotelSend ifT MIB Table i dwOutOctets End If Next LabelInfo1 Caption TotelRecv 显示当前接收的数据字节 LabelInfo2 Caption TotelSend 显示当前发送的数据字节 If LastRecv 0 And LastSend 0 Then CurStream Format CDbl TotelRecv TotelSend LastRecv LastSend CDbl 1024 0000 00 For i 49 To 1 Step 1 设置 Shape 控件的高度 NewArray i NewArray i 1 Next NewArray 0 CLng CurStream Call DrawStream 显示柱状图 End If LabelInfo3 Caption CurStream 当前的传输速率 If CurStream MaxStream Then 设置最大传输速率 MaxStream CurStream LabelInfo4 Caption MaxStream End If LastRecv TotelRecv LastSend TotelSend 设置之前接收 发送的数据字节 绘制柱状图 Private Sub DrawStream For i 0 To 49 Shape i Top 2000 NewArray i Shape 控件的顶端距 Shape i Height NewArray i Shape 控件的高度 Next End Sub 4 程序运行截图 第四节 实例二 探测到某个 IP 地址经过的路由列表 计算机在 Internet 中传递信息时 并不能直接从某一主机上得到去往另一主机的路径 必 须通过路由将信息传到主机 发送 ICMP 报时 ICMP 报头中包含了一个 TTL 设置 报文 每当经过一个路由 TTL 值相应的减 1 当请求报文在传输过程中超时 即 TTL 被减为 0 则该路由器返回一个目标不可达到报文 否则在 TTL 未被减
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 特种设备及其安全附件检定周期速查表
- 2025年工业互联网平台计算机视觉在航空航天发动机缺陷检测的应用分析报告
- 综合解析华东师大版7年级下册期末试卷及答案详解【夺冠】
- 环保公司年休假管理办法
- 自考专业(计算机信息管理)全真模拟模拟题及参考答案详解(研优卷)
- 环保公司质量管理办法
- 自考专业(会计)复习提分资料带答案详解(满分必刷)
- 主管护师(中级)常考点试卷带答案详解(研优卷)
- 中级银行从业资格之中级银行业法律法规与综合能力题库练习备考题附答案详解(培优a卷)
- 电竞公司项目研发管理办法
- 手术室术中无菌技术课件
- 2025至2030中国食品工业中的X射线检查系统行业项目调研及市场前景预测评估报告
- 企业安全生产费用支出负面清单
- 2024云南师范大学辅导员招聘笔试真题
- 2025年广省中考作文《走到田野去》写作指导及范文
- 2025年山东省中考数学试卷(含答案逐题解析)
- 慢阻肺非肺部手术麻醉管理策略
- 一例ICD置入患者的护理查房
- 2025至2030年中国露点传感器行业市场研究分析及投资前景规划报告
- 护理术中配合操作规范
- 孩子改姓改名协议书
评论
0/150
提交评论