[轉]在vb中使用Iphlpapi.dll獲取網絡信息

在vb中使用Iphlpapi.dll獲取網絡信息
http://blog.csdn.net/UruseiBest
※==================================================================
※本連載文章說明:
※1、連載首發於《軟件報》(http://www.sweek.com)2006年21期(2006年5月22日);
※2、此次網上連載採用的是原稿件結構,內容與《軟件報》發表略有不同;
※3、謝絕除《軟件報》及其相關刊物之外的傳統媒體部分或全部轉載;
※4、謝絕任何收費媒體、網絡轉載;
※5、原作者:uruseibest ,blog:http://blog.csdn.net/uruseibest
※6、如有其它疑問,請聯繫作者;
※7、如有轉載,必須連同本說明一並發表,否則將追究轉載者責任。
※======================================================================


第一章 前言

第二章 主要函數
第一節 獲取本機網絡適配器的信息 GetAdaptersInfo
第二節 獲取MIB-II 接口表 GetIfTable
第三節 獲取本機TCP 信息列表 GetTcpStatistics
第四節 獲取當前TCP連接情況 GetTcpTable
第五節 獲取本機UDP信息列表 GetUdpStatistics
第六節 獲取當前UDP連接情況 GetUdpTable
第七節 獲取本機網間控制報文協議信息 GetIcmpStatistics
第八節 獲取本機網絡參數 GetNetworkParams
第九節 獲取網卡–IP地址映射表 GetIpAddrTable
第十節 獲取本機已探測的IP – 物理地址映射表 GetIpNetTable
第十一節 獲取當前計算機的IP信息 GetIpStatistics
第十二節 獲得本機系統網絡接口適配器的列表 GetInterfaceInfo
第十三節 獲得目的地IP(只能是所在局域網中的IP)對應的物理地址 SendARP
第十四節 返回本機網絡接口數量 GetNumberOfInterfaces
第十五節 設置本機默認的生存時間(time-to-live:TTL)值 SetIpTTL
第十六節 獲取本機IP 路由表 GetIpForwardTable
第十七節 設置TCP連接狀態 SetTcpEntry
第十八節 在本地電腦的地址解析協議(ARP :Address Resolution Protocol)表中創建和刪除一個ARP CreateIpNetEntry
第十九節 Ping一個IP地址 IcmpCreateFile...
第二十節 測定到指定目的地往返時間和跳躍數
第二十一節 增加和刪除一個IP地址


第三章 IPHLPAPI 的其他函數
第一節 IPHLPAPI 的其它函數
第二節 從C原型到Vb聲明


第四章 錯誤處理及其它
第一節 錯誤處理
第二節 一個重要函數
第三節 實例一:網絡數據流量圖
第四節 實例二:探測到某個IP地址經過的路由列表

第五章 結束語


第一章 前言
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 串行適配器(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         ‘是否啓用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、運行時截圖:

第二節 獲取MIB-II 接口表
1、函數:
Private Declare Function GetIfTable Lib "iphlpapi.dll" (ByRef pIfTable As MIB_IFTABLE, ByRef pdwSize As Long, ByVal bOrder As Long) As Long
參數說明:
pIfTable:[輸入]成功的話指向一個MIB_IFTABLE類型的緩衝區。
PdwSize:[輸入,輸出]指定pIfTable參數所佔緩衝區的大小,如果緩衝區不是足夠大返回接口表,函數設置這個參數等於所必須的緩衝區大小。
bOrder:[輸入]指定返回的接口表是否按接口序號按上升順序排列。如果參數爲TRUE那麼按上升順序排列。
返回值:成功,返回0;失敗,返回錯誤代碼。

2、使用到的類型:
①MIB_IFTABLE  包含接口表
Private Type MIB_IFTABLE
    dwNumEntries As Long            '當前網絡接口的總數
    MIB_Table(9) As MIB_IFROW         '指向一個包含MIB_IFROW類型的指針
End Type
②MIB_IFROW 保存接口信息
Private Type MIB_IFROW
    wszName(0 To 511) As Byte '接口名稱的Unicode字符串,必須爲512字節
    dwIndex As Long         '接口編號
    dwType As Long          '接口類型,參看IP_ADAPTER_INFO類型的Type成員
    dwMtu As Long           '最大傳輸單元
    dwSpeed As Long          '接口速度(字節)
    dwPhysAddrLen As Long   '由bPhysAddr獲得的物理地址有效長度
    bPhysAddr(0 To 7) As Byte '物理地址
    dwAdminStatus As Long     '接口管理狀態
dwOperStatus As Long            '操作狀態,以下值之一:

常量名稱  值  說明
MIB_IF_OPER_STATUS_NON_OPERATIONAL 0  網絡適配器被禁止,例如:地址衝突
MIB_IF_OPER_STATUS_UNREACHABLE 1  沒有連接
MIB_IF_OPER_STATUS_DISCONNECTED 2  局域網:電纜未連接;廣域網:無載波信號
MIB_IF_OPER_STATUS_CONNECTING 3  廣域網適配器連接中
MIB_IF_OPER_STATUS_CONNECTED 4  廣域網適配器連接上遠程對等點
MIB_IF_OPER_STATUS_OPERATIONAL 5  局域網適配器默認狀態

    dwLastChange As Long    '操作狀態最後改變的時間
    dwInOctets As Long        '總共收到(字節)
    dwInUcastPkts As Long     '總共收到(unicast包)
    dwInNUcastPkts As Long    '總共收到(non-unicast包),包括廣播包和多點傳送包
    dwInDiscards As Long     '收到後丟棄包總數(即使沒有錯誤)
    dwInErrors As Long        '收到出錯包總數
    dwInUnknownProtos As Long   '收到後因協議不明而丟棄的包總數
    dwOutOctets As Long       '總共發送(字節)
    dwOutUcastPkts As Long    '總共發送(unicast包)
    dwOutNUcastPkts As Long '總共發送(non-unicast包),包括廣播包和多點傳送包
    dwOutDiscards As Long     '發送丟棄包總數(即使沒有錯誤)
    dwOutErrors As Long       '發送出錯包總數
    dwOutQLen As Long      '發送隊列長度
    dwDescrLen As Long       ' bDescr部分有效長度
    bDescr(0 To 255) As Byte  '接口描述
End Type

3、使用到的常量:

4、主要代碼分析:
①分配足夠大的緩存空間,然後直接調用GetIfTable獲得接口信息:
Dim ifT As MIB_IFTABLE
LenIfT = Len(ifT)
RValue = GetIfTable(ifT, LenIfT, True)
②由ifT.dwNumEntries獲得接口數量,然後用for…next循環獲取每個接口信息:
For i = 0 To ifT.dwNumEntries - 1
Print "接口編號:" & ifT.MIB_Table(i).dwIndex
Print "接口速度:" & ifT.MIB_Table(i).dwSpeed
Next
③物理地址的獲得:
    PhysAddr = Right("00" & Hex(ifT.MIB_Table(i).bPhysAddr(0)), 2)
    For j = 1 To 5
        PhysAddr = PhysAddr & "-" & Right("00" & Hex(ifT.MIB_Table(i).bPhysAddr(j)), 2)
    Next
Print "物理地址:" & PhysAddr

5、運行時截圖:
第三節 獲取本機TCP 信息列表
1、函數:
Private Declare Function GetTcpStatistics Lib "iphlpapi.dll" (ByRef pTcpStats As MIB_TCPSTATS) As Long
參數說明:
pStats :[輸出]指向一個接收本機TCP統計表的MIB_TCPSTATS類型
返回值:成功,返回0;失敗,返回錯誤代碼。

2、使用到的類型:

①MIB_TCPSTATS 包含本機上正運行的TCP協議的統計表
Type MIB_TCPSTATS
dwRtoAlgorithm As Long      ‘指定重傳輸(RTO:retransmission time-out)算法
    dwRtoMin As Long              ‘重傳輸超時的最小值,毫秒
    dwRtoMax As Long              ‘重傳輸超時的最大值,毫秒
    dwMaxConn As Long           ‘連接最大數目,如果爲-1,則連接的最大數目是可變的
    dwActiveOpens As Long       ‘主動連接數目,即客戶端正向服務器進行連接數目
    dwPassiveOpens As Long     ‘被動連接數目,即服務器監聽連接客戶端請求數目
    dwAttemptFails As Long       ‘嘗試連接失敗的次數
    dwEstabResets As Long        ‘對已建立的連接實行重設的次數
    dwCurrEstab As Long           ‘目前已建立的連接
    dwInSegs As Long               ‘收到分段數據報的數目
    dwOutSegs As Long             ‘傳輸的分段數據報數目,不包括轉發的數據包
    dwRetransSegs As Long              ‘轉發的分段數據報數目
    dwInErrs As Long                ‘收到錯誤的數目
    dwOutRsts As Long             ‘重設標誌設定後傳輸分段數據報數目
    dwNumConns As Long         ‘累計連接的總數
End Type

3、使用到的常量:

4、主要代碼分析:
① 定義一個MIB_TCPSTATS類型變量,然後直接調用GetTcpStatistics:
       Dim mTcpS As MIB_TCPSTATS
RValue = GetTcpStatistics(mTcpS)

5、運行時截圖:

第四節 獲取當前TCP連接情況
1、函數:
Private Declare Function GetTcpTable Lib "iphlpapi.dll" (ByRef pTcpTable As MIB_TCPTABLE, ByRef pdwSize As Long, ByVal bOrder As Long) As Long
參數說明:
pTcpTable:[輸入]指向包含了MIB_TCPTABLE類型的TCP 連接表。
pdwSize:[輸入,輸出]指向pTcpTable參數的緩衝區大小,如果分配的緩衝不夠,那麼就等於最小需要緩衝。
bOrder:[輸入]指定連接表是否按照類型排列。TRUE,那麼就按以下類型順序排列:Local IP address,Local port,Remote IP address,Remote port。
返回值:成功,返回0;失敗,返回錯誤代碼。

2、使用到的類型:
①MIB_TCPTABLE 類型包含Tcp連接表。
Type MIB_TCPTABLE
dwNum_Of_Entries As Long               ‘當前包含MIB_TCPROW類型的總數
TCP_Table() As MIB_TCPROW        ‘指向包含MIB_TCPROW類型的指針
End Type
備註:實際使用中可以定義:TCP_Table(120) As MIB_TCPROW       ' 預留足夠緩存
②MIB_TCPROW 類型包含了TCP連接信息。
Type MIB_TCPROW
dwState As Long                 ' TCP連接狀態,爲以下值之一:
常量名稱  值  說明
MIB_TCP_STATE_CLOSED 1  關閉
MIB_TCP_STATE_LISTEN 2  正在監聽
MIB_TCP_STATE_SYN_SENT 3  同步發送
MIB_TCP_STATE_SYN_RCVD 4  同步接收
MIB_TCP_STATE_ESTAB 5  已建立
MIB_TCP_STATE_FIN_WAIT1 6  FINWAIT 1
MIB_TCP_STATE_FIN_WAIT2 7  FINWAIT 2
MIB_TCP_STATE_CLOSE_WAIT 8  關閉等待
MIB_TCP_STATE_CLOSING 9  正在關閉
MIB_TCP_STATE_LAST_ACK 10  最後一次確認
MIB_TCP_STATE_TIME_WAIT 11  時間等待
MIB_TCP_STATE_DELETE_TCB 12  刪除連接

dwLocalAddr As Long         '本地IP
dwLocalPort As Long          '本地端口
dwRemoteAddr As Long      '遠程機器IP
dwRemotePort As Long       '遠程機器端口
End Type

3、使用到的常量:

4、主要代碼分析:
①定義一個MIB_TCPTABLE類型的變量,因爲我們在定義MIB_TCPTABLE類型的時候預留了足夠的緩存( TCP_Table(120) As MIB_TCPROW ),因此獲得定義變量的大小後直接調用GetTcpTable,但是要注意的是,實際獲得的TCP連接的總數應爲dwNum_Of_Entries的值,一般小於我們的定義(120):
Dim mtcp As MIB_TCPTABLE
mtcplen = Len(mtcp)
rvalue = GetTcpTable(mtcp, mtcplen, True)
②使用For…Next循環遍歷各個Tcp連接的信息:
For i = 0 To mtcp.dwNum_Of_Entries - 1
Print  mtcp.TCP_Table(i).dwLocalAddr & "->" & mtcp.TCP_Table(i).dwRemoteAddr
Next
③因爲MIB_TCPROW 類型中dwLocalAddr、dwRemoteAddr均爲一長整型數,因此要通過轉換來獲得IP地址:
Dim Ip_Buf(1 To 4) As Byte
CopyMemory Ip_Buf(1), dwLocalAddr, 4
GetIp = CStr(Ip_Buf(1)) + "." + CStr(Ip_Buf(2)) + "." + CStr(Ip_Buf(3)) + "." + CStr(Ip_Buf(4))
④因爲MIB_TCPROW 類型中dwLocalPort、dwRemotePort均爲一長整型數,因此要通過轉換來獲得端口:
GetPort = dwLocalPort/ 256 + (dwLocalPort Mod 256) * 256

5、運行時截圖:

第五節 獲取本機UDP信息列表
1、函數:
Private Declare Function GetUdpStatistics Lib "iphlpapi.dll" (pStats As MIB_UDPSTATS) As Long
參數說明:
pStats:[輸出]指向一個接收到本機UDP統計表的MIB_UDPSTATS類型
返回值:成功,返回0;失敗,返回錯誤代碼。

2、使用到的類型:
①MIB_UDPSTATS 包含UDP (User Datagram Protocol) 運行信息
Type MIB_UDPSTATS
    dwInDatagrams As Long   '已收到數據報數目
    dwNoPorts As Long       '因爲端口號有誤而丟棄的數據報數目
    dwInErrors As Long        '已收到多少錯誤數據報,不包括dwNoPorts中統計的數目
    dwOutDatagrams As Long  '已傳輸數據報數目
    dwNumAddrs As Long     'UDP監聽者表中接口數目
End Type

3、使用到的常量:

4、主要代碼分析:
①定義一個MIB_UDPSTATS類型的變量,然後直接使用GetUdpStatistics函數即可:
Dim Mudp As MIB_UDPSTATS
r = GetUdpStatistics(Mudp)

5、運行時截圖:

第六節 獲取當前UDP連接情況
1、函數:
Private Declare Function GetUdpTable Lib "iphlpapi.dll" (ByRef pTcpTable As MIB_UDPTABLE, ByRef pdwSize As Long, ByVal bOrder As Long) As Long
參數說明:
pUdpTable:[輸出]指向一個緩存作爲MIB_UDPTABLE類型用來接收UDP監聽表。
pdwSize:[輸入或輸出]輸入,指定pUdpTable參數所佔緩存大小;輸出,如果指定的緩存大小不足,將設置爲所須的大小。
bOrder:[輸入]指定返回的表是否按分類排列。如果爲TRUE,按以下分類排列:1、IP地址;2、端口。
返回值:成功,返回0;失敗,返回錯誤代碼。

2、使用到的類型:
①MIB_UDPTABLE 包含MIB_UDPROW類型
Type MIB_UDPTABLE
    dwNum_Of_Entries As Long                 '當前 UDP連接的總數
    UDP_Table() As MIB_UDPROW              '指向包含MIB_UDPROW類型的指針
End Type
備註:實際使用中可以定義:UDP_Table(120) As MIB_UDPROW      ' 預留足夠緩存

②MIB_UDPROW包含發送和接收UDP數據包的地址信息。它的格式如下:
Type MIB_UDPROW
    dwLocalAddr As Long         '本地IP
    dwLocalPort As Long         '本地端口
End Type

3、使用到的常量:

4、主要代碼分析:
①定義一個MIB_TCPTABLE類型的變量,因爲我們在定義MIB_TCPTABLE類型的時候預留了足夠的緩存( TCP_Table(120) As MIB_TCPROW ),因此獲得定義變量的大小後直接調用GetTcpTable。但是要注意的是,實際獲得的UDP連接的總數應爲dwNum_Of_Entries的值,一般小於我們的定義(120):
Dim Mudp As MIB_UDPTABLE
mudplen = Len(Mudp)
rvalue = GetUdpTable(Mudp, mudplen, True)
②使用For…Next循環遍歷各個Tcp連接的信息:
For i = 0 To Mudp.dwNum_Of_Entries - 1
           Print  Mudp.UDP_Table(i).dwLocalAddr & ":" & Mudp.UDP_Table(i).dwLocalPort
Next
③因爲MIB_UDPTABLE 類型中dwLocalAddr爲一長整型數,因此要通過轉換來獲得IP地址:
Dim Ip_Buf(1 To 4) As Byte
CopyMemory Ip_Buf(1), dwLocalAddr, 4
GetIp = CStr(Ip_Buf(1)) + "." + CStr(Ip_Buf(2)) + "." + CStr(Ip_Buf(3)) + "." + CStr(Ip_Buf(4))
④因爲MIB_UDPTABLE類型中dwLocalPort爲一長整型數,因此要通過轉換來獲得端口:
GetPort = dwLocalPort/ 256 + (dwLocalPort Mod 256) * 256

5、運行時截圖:

第七節 獲取本機網間控制報文協議(ICMP:Internet Control Message Protocol)信息
1、函數:
Private Declare Function GetIcmpStatistics Lib "iphlpapi.dll" (pStats As MIB_ICMP) As Long
參數說明:
pStats:[輸出] 指向一個本機收到ICMP 統計表的MIB_ICMP類型。
返回值:成功,返回0;失敗,返回錯誤代碼。

2、使用到的類型:
①MIB_ICMP 爲特殊適配器包含網間控制報文協議(ICMP:Internet Control Message Protocol)統計表。
Public Type MIB_ICMP
    stats As MIBICMPINFO    '指定MIBICMPINFO類型包含了電腦ICMP統計信息表
End Type
②MIBICMPINFO通過MIBICMPSTATS結構存儲的接收或發出的ICMP信息。
Public Type MIBICMPINFO
  icmpInStats As MIBICMPSTATS   '指向MIBICMPSTATS類型,包含接收數據
  icmpOutStats As MIBICMPSTATS '指向MIBICMPSTATS類型,包含發出數據
End Type

③MIBICMPSTATS包含ICMP (Internet Control Message Protocol)接收或發出的統計信息。

Public Type MIBICMPSTATS

    dwMsgs As Long          '已收發多少消息

    dwErrors As Long          '已收發多少錯誤

    dwDestUnreachs As Long    '已收發多少"目標不可抵達"消息

    dwTimeExcds As Long            '已收發多少生存期已過消息

    dwParmProbs As Long            '已收發多少表明數據報內有錯誤IP信息的消息

    dwSrcQuenchs As Long           '已收發多少源結束消息

    dwRedirects As Long        '已收發多少重定向消息

    dwEchos As Long                '已收發多少ICMP響應請求

    dwEchoReps As Long             '已收發多少ICMP響應應答

    dwTimestamps As Long    '已收發多少時間戳請求

    dwTimestampReps As Long        '已收發多少時間戳響應

    dwAddrMasks As Long      '已收發多少地址掩碼

    dwAddrMaskReps As Long '已收發多少地址掩碼響應

End Type

 

3、使用到的常量:

 

4、主要代碼分析:

①定義一個MIB_ICMP類型的變量,然後直接調用GetIcmpStatistics:

Dim Micmp As MIB_ICMP

r = GetIcmpStatistics(Micmp)

②使用Micmp.stats.icmpInStats成員獲取收到的數據信息;使用Micmp.stats.icmpOutStats成員獲取發送的數據信息。

 

5、運行時截圖:

第八節 獲取本機網絡參數

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、運行時截圖:

第九節 獲取網卡–IP地址映射表

1、函數:

Private Declare Function GetIpAddrTable Lib "iphlpapi.dll" (pIpAddrTable As MIB_IPADDRTABLE, pdwSize As Long, bOrder As Long) As Long

參數說明:

pIpAddrTable:[輸出] 指向一個接收網卡–IP地址映射表的 MIB_IPADDRTABLE類型的指針。

pdwSize:[輸入,輸出]輸入,指定pIpAddrTable 參數指向緩存的大小;輸出,如果指定的緩存大小不夠大,將設置此參數爲必須的大小。

bOrder:[輸入] 指定返回的映射表是否按照IP地址排列。TRUE,按順序排列。

返回值:成功,返回0;失敗,返回錯誤代碼。

 

2、使用到的類型:

①MIB_IPADDRTABLE 包含IP地址入口表
Type MIB_IPADDRTABLE

    dwNumEntries As Long              '表明table字段數組中有多少MIB_IPADDROW條目

    table() As MIB_IPADDRROW      '指向MIB_IPADDRROW類型

End Type

②MIB_IPADDRROW 指定特殊IP地址的信息
Type MIB_IPADDRROW

    dwAddr As Long          '接口的IP地址

    dwIndex As Long     '與IP地址關聯的接口之索引

    dwMask As Long         '子網掩碼

    dwBCastAddr As Long   ’廣播地址

    dwReasmSize As Long '已收到的數據報重裝後的最大長度

    unused1 As Integer      '未使用

    unused2 As Integer      '未使用

End Type

 

3、使用到的常量:

 

4、主要代碼分析:

①定義一個MIB_IPADDRTABLE類型的變量並獲取此變量的大小,然後直接調用GetTcpTable:

Dim IpAddrTable As MIB_IPADDRTABLE

dwsize = Len(IpAddrTable)

r = GetIpAddrTable(IpAddrTable, dwsize, order)

②調用For…Next循環,獲取每個網卡–IP地址映射的信息:

For i = 0 To IpAddrTable.dwNumEntries - 1

    Print "dwAddr", IpAddrTable.table(i).dwAddr

Next

③將長整型格式的ip地址轉換爲標準IP地址格式("xxx.xxx.xxx.xxx"格式):

Private Function inversaip(IPAddrLng As Long) As String

Dim sos As String

Dim i As Long

Dim IPadd As String

 

IPadd = Right("00000000" & Hex(IPAddrLng), 8)

sos = ""

For i = 1 To Len(IPadd) Step 2

    sos = CInt("&h" & Mid(IPadd, i, 2)) & "." & sos

Next i

inversaip = Mid(sos, 1, Len(sos) - 1)

End Function

 

5、運行時截圖:

 

第十節 獲取本機已探測的IP – 物理地址映射表

1、函數:

Private Declare Function GetIpNetTable Lib "iphlpapi.dll" (pIpNetTable As MIB_IPNETTABLE, pdwSize As Long, bOrder As Long) As Long

參數說明:

pIpNetTable:[輸出]指向一個返回IP至物理地址映射作爲MIB_IPNETTABLE類型的緩存。

pdwSize:[輸入,輸出] 輸入,指定pIpNetTable參數指向緩存的大小;輸出,如果指定的緩存大小不夠大,將設置此參數爲必須的大小。

bOrder:[輸入] 指定返回的映射表是否按照IP地址排列。TRUE,按序排列。

返回值:成功,返回0;失敗,返回錯誤代碼。

 

2、使用到的類型:

①MIB_IPNETTABLE 包含地址解析協議(ARP :Address Resolution Protocol)接口入口表。

Type MIB_IPNETTABLE

       DwNumEntries As Long                            ‘當前包含MIB_IPNETROW類型的總數

       MIB_Table() As MIB_IPNETROW      ‘指向一個包含MIB_IPNETROW類型的指針

End Type

 

②MIB_IPNETROW 包含地址解析協議(ARP :Address Resolution Protocol)接口信息:

Type MIB_IPNETROW

    dwIndex As Long                '指定適配器的索引

    dwPhysAddrLen As Long    'bPhysAddrs字段內包含的物理接口的長度(字節),通常爲6

    bPhysAddr(MAXLEN_PHYSADDR) As Byte      '字節數組,包含適配器的物理地址

    dwAddr As Long                       'IP地址

dwType As Long                       'ARP接口的類型,以下值之一:

常量名稱  值  說明
MIB_IPNET_TYPE_OTHER 1 其他條目
MIB_IPNET_TYPE_INVALID 2 無效條目
MIB_IPNET_TYPE_DYNAMIC 3 動態條目
MIB_IPNET_TYPE_STATIC 4 靜態條目

 


End Type

 

3、使用到的常量:

Const MAXLEN_PHYSADDR = 7

 

4、主要代碼分析:

①定義一個MIB_IPNETTABLE類型的變量並獲取此變量的大小,然後直接調用GetIpNetTable:

Dim ipNett As MIB_IPNETTABLE

dwsize = Len(ipNett)

r = GetIpNetTable(ipNett, dwsize, bOrder)

②調用For…Next循環,獲取每個網卡–IP地址映射的信息:

For i = 0 To ipNett.dwNumEntries - 1

    Print "類型", ipNett.MIB_Table(i).dwType

Next

③在②中循環獲取物理地址:

    ByteToS = ""

    ByteToS = Right("00" & Hex(ipNett.MIB_Table(i).bPhysAddr(0)), 2)

    For j = 1 To ipNett.MIB_Table(i).dwPhysAddrLen - 1 Step 1

        ByteToS = ByteToS & "-" & Right("00" & Hex(ipNett.MIB_Table(i).bPhysAddr(j)), 2)

    Next

④將長整型格式的ip地址轉換爲標準IP地址格式("xxx.xxx.xxx.xxx"格式):

Private Function inversaip(IPAddrLng As Long) As String

       ‘同 十、 4、 ③

End Function

 

5、運行時截圖:

第十一節 獲取當前計算機的IP信息

1、函數:

Private Declare Function GetIpStatistics Lib "iphlpapi.dll" (pStats As MIB_IPSTATS) As Long

參數說明:

pStats:[輸出] 指向一個包含IP信息的MIB_IPSTATS類型。

返回值:成功,返回0;失敗,返回錯誤代碼。

 

2、使用到的類型:

①MIB_IPSTATS 存儲於電腦的IP協議運行信息。
Type MIB_IPSTATS

    dwForwarding As Long        '啓用或者禁止轉發IP包(IP forwarding)

    dwDefaultTTL As Long        '指定默認初始化的生存時間(TTL)的值

    dwInReceives As Long     '已收到數據包數目

    dwInHdrErrors As Long    '已收到報頭有誤的數據包數目

    dwInAddrErrors As Long   '已收到地址有誤的數據包數目

    dwForwDatagrams As Long  '已轉發數據報數目

    dwInUnknownProtos As Long      '已收到協議不明的數據報數目

    dwInDiscards As Long         '已收到多少已丟棄的數據報

    dwInDelivers As Long       '已收到多少已投遞的數據報

    dwOutRequests As Long     '發送IP請求傳輸的數據報數目,不包括轉發的數據包

    dwRoutingDiscards As Long '已丟棄的發送數據報數目

    dwOutDiscards As Long     '丟棄的傳輸數據報數目

    dwOutNoRoutes As Long     '沒有路由目標IP地址而被丟棄的數據報數目

    dwReasmTimeout As Long   '分段數據報完全到達的最長時間,再此時間之外數據將被丟棄

    dwReasmReqds As Long     '需要重組的數據報數目

    dwReasmOks As Long       '已成功重組的數據報數目

    dwReasmFails As Long       '不能進行重組的數據報數目

    dwFragOks As Long        '已成功進行分段的數據報數目

    dwFragFails As Long      '不能進行分段的數據報數目,這些數據包將被丟棄

    dwFragCreates As Long      '可被分段的數據報數目

    dwNumIf As Long           '接口數目

    dwNumAddr As Long                '與此計算機關聯的IP地址數目

    dwNumRoutes As Long      '路由表中可用的路由數目

End Type

 

3、使用到的常量:

 

4、主要代碼分析:

①定義一個MIB_IPSTATS類型的變量,然後直接調用GetIpStatistics:

Dim MI As MIB_IPSTATS

r = GetIpStatistics(MI)

    Print "啓用或者禁止轉發IP包", MI.dwForwarding

 

5、運行時截圖:

 

第十二節 獲得本機系統網絡接口適配器的列表

1、函數:

Private Declare Function GetInterfaceInfo Lib "iphlpapi.dll" (pIfTable As IP_INTERFACE_INFO, dwOutBufLen As Long) As Long

參數說明:

pIfTable: [輸入] 指向一個指定一個包含了適配器列表的IP_INTERFACE_INFO類型的緩存。這個緩存應當由調用者分配。

dwOutBufLen:[輸出] 指向一個DWORD變量。如果pIfTable參數爲空,或者緩存不夠大,這個參數返回必須的大小。

返回值:成功,返回0;失敗,返回錯誤代碼。

 

2、使用到的類型:

①IP_INTERFACE_INFO 包含本機系統網絡適配器列表

Public Type IP_INTERFACE_INFO

    NumAdapters As Long             '適配器編號

    Adapter(1) As IP_ADAPTER_INDEX_MAP     'IP_ADAPTER_INDEX_MAP類型的數組

End Type

 

②IP_ADAPTER_INDEX_MAP 存儲和適配器名稱關聯的接口序號

Public Type IP_ADAPTER_INDEX_MAP

    Index As Long       '和適配器關聯的接口序號

Name As String * MAX_ADAPTER_NAME_LENGTH

'指向一個包含了適配器名稱的Unicode字符串

End Type

 

3、使用到的常量:

Const MAX_ADAPTER_NAME_LENGTH = 260

 

4、主要代碼分析:

①定義一個IP_INTERFACE_INFO類型的變量,對函數GetInterfaceInfo進行兩次調用,第一次調用獲得參數dwOutBufLen的實際大小;第二次調用獲取pIfTable數據:

Dim pIfTable As IP_INTERFACE_INFO

r = GetInterfaceInfo(pIfTable, dwOutBufLen)

r = GetInterfaceInfo(pIfTable, dwOutBufLen)

②調用For…Next循環,獲取每個網絡接口適配器的信息,使用StrConv函數對獲得的Unicode適配器名稱進行轉換:

For i = 0 To pIfTable.NumAdapters - 1

    Print pIfTable.Adapter(i).Index

    Print StrConv(pIfTable.Adapter(i).Name, vbFromUnicode)

Next

5、運行時截圖:

第十三節 獲得目的地IP(只能是所在局域網中的IP)對應的物理地址

1、函數:

①Private Declare Function SendARP Lib "iphlpapi.dll" (ByVal DestIP As Long, ByVal SrcIP As Long, pMacAddr As Long, PhyAddrLen As Long) As Long

參數說明:

DestIP:[輸入]目的地IP地址。

SrcIP:[輸入]發送地IP地址。可選參數,調用者可以指定此參數爲0。

pMacAddr:[輸出]指向一個ULONG變量數組(array)。數組前6個字節(bytes)接收由 DestIP指定的目的地IP物理地址。

PhyAddrLen:[輸入,輸出]輸入,指定用戶設置pMacAddr接收MAC地址的最大緩存大小,單位字節;輸出,指定了寫入pMacAddr的字節數量。

返回值:成功,返回0;失敗,返回錯誤代碼。

 

② inet_addr是Winsocket的函數而非”iphlpapi.dll”提供的函數,目的是將標準IP地址(”xxx.xxx.xxx.xxx”)的字符串轉爲電腦能識別的長整型的數據。

Private Declare Function inet_addr Lib "wsock32.dll" (ByVal cp As String) As Long

參數說明:

       cp:要轉換的”xxx.xxx.xxx.xxx”形式的ip地址

 

2、使用到的類型:

 

3、使用到的常量:

 

4、主要代碼分析:

①定義目標ip地址和源ip地址,源ip地址可以爲0或inet_addr("127.0.0.1")或inet_addr(本機某個ip)。

Dim Dip As Long

Dim Sip As Long

Dip = inet_addr("xxx.xxx.xxx.xxx")

Sip = 0 'inet_addr("127.0.0.1")

②定義獲得的目標ip對應的物理地址,這裏應採用定義:

Dim Maca(1) As Long

③調用SendARP函數:

PhyaddrL = 6

r = SendARP(Dip, Sip, Maca(0), PhyaddrL)

④如果探測的目標地址不存在,產生錯誤31,否則SendARP將返回0

Print Hex(Maca(0)), Hex(Maca(1))

'注意顯示值爲 aabbccdd eeff  ,對應物理地址爲 dd-cc-bb-aa-ff-ee

‘以下是真正的物理地址:

Print Right(Hex(Maca(0)), 2) & "-" & Mid(Hex(Maca(0)), 5, 2) & "-" & Mid(Hex(Maca(0)), 3, 2) & "-"; Left(Hex(Maca(0)), 2) & "-" & Right(Hex(Maca(1)), 2) & "-" & Left(Hex(Maca(1)), 2)

 

5、運行時截圖:
第十四節 返回本機網絡接口數量

1、函數:

Private Declare Function GetNumberOfInterfaces Lib "iphlpapi.dll" (pdwNumIf As Long) As Long

參數說明:

pdwNumIf:[輸出] 指向一個接收本機接口數量的變量。

備註:返回的接口數包括loopback接口。這個數目比GetAdaptersInfo和GetInterfaceInfo函數返回的適配器數目要多一,因爲那兩個函數不返回loopback接口的信息。

返回值:成功,返回0;失敗,返回錯誤代碼。

 

2、使用到的類型:

 

3、使用到的常量:

 

4、主要代碼分析:

①定義一個Long型變量,然後直接調用函數GetNumberOfInterfaces即可:

Dim dwNumIf As Long

r = GetNumberOfInterfaces(dwNumIf)

Print "本機接口數量", dwNumIf

 

5、運行時截圖:

第十五節 設置本機默認的生存時間(time-to-live:TTL)值

1、函數:

Private Declare Function SetIpTTL Lib "iphlpapi.dll" (ByVal nTTL As Long) As Long

參數說明:

nTTL: [輸入] 本機的新的生存時間(TTL)

返回值:成功,返回0;失敗,返回錯誤代碼。

 

2、使用到的類型:

 

3、使用到的常量:

 

4、主要代碼分析:

①定義一個Ttl值,如64、128等,然後直接調用函數SetIpTTL:

Ttl = 128

r = SetIpTTL(Ttl)

 

5、運行時截圖:

 

第十六節 獲取本機IP 路由表

1、函數:

Private Declare Function GetIpForwardTable Lib "iphlpapi.dll" (pIpForwardTable As MIB_IPFORWARDTABLE , pdwSize As Long, bOrder As Long) As Long

參數說明:

pIpForwardTable:[輸出]指向接收IP路由表作爲MIB_IPFORWARDTABLE類型的緩存

pdwSize:[輸入,輸出] 輸入,指定 pIpForwardTable參數指向緩存的大小;輸出,如果指定的緩存大小不夠大,將設置此參數爲必須的大小。

bOrder:[輸入] 指定返回的映射表是否按照種類排列。TRUE,按以下順序排列:目的地地址;生成路由的協議;多路徑路由策略;下一躍點的地址。

返回值:成功,返回0;失敗,返回錯誤代碼。

 

2、使用到的類型:

①MIB_IPFORWARDTABLE 包含了IP路由表接口。

Type MIB_IPFORWARDTABLE

    dwNumEntries As Long                            '表中路由接口數目

    Table(120) As MIB_IPFORWARDROW      '指向MIB_IPFORWARDROW類型陣列

End Type

 

②MIB_IPFORWARDROW 包含描述IP網絡路由的信息

public type MIB_IPFORWARDROW

       dwForwardDest as long      '目的地IP地址

       dwForwardMask as long     '目的地主機的子網掩碼

       dwForwardPolicy as long    '將會引起多通道路由選擇的設置條件。參看RFC 1354。

       dwForwardNextHop as long        '路由器中IP地址的下一個躍點

       dwForwardIfIndex as long         '路由的接口序號

       dwForwardType as long      'RFC 1354中路由的定義,以下值之一:

常量名稱
 值
 說明

MIB_IPROUTE_TYPE_OTHER
 1
 其他

MIB_IPROUTE_TYPE_INVALID
 2
 非法路由

MIB_IPROUTE_TYPE_DIRECT
 3
 下一個躍點是目的地(本地路由)

MIB_IPROUTE_TYPE_INDIRECT
 4
 下一個躍點不是目的地 (遠程路由)


       dwForwardProto as long  '生成路由的協議,具體IPX協議值參看Routprot.h,而IP條目參看Iprtrmib.h

       dwForwardAge as long  '路由持續時間,毫秒。僅用於路由遠程訪問服務(RRAS:Routing and Remote Access Service)運行時候,並且僅當路由類型爲PROTO_IP_NETMGMT。

       dwForwardNextHopAS as long  '下一躍點的自治系統編號

       dwForwardMetric1 as long  '路由協議專有的公制值。詳情參見RFC 1354。

       dwForwardMetric2 as long  '路由協議專有的公制值。詳情參見RFC 1354。

       dwForwardMetric3 as long  '路由協議專有的公制值。詳情參見RFC 1354。

       dwForwardMetric4 as long  '路由協議專有的公制值。詳情參見RFC 1354。

       dwForwardMetric5 as long  '路由協議專有的公制值。詳情參見RFC 1354。

End Type

 

3、使用到的常量:

 

4、主要代碼分析:

①定義一個MIB_IPFORWARDTABLE類型的變量,對函數GetIpForwardTable進行兩次調用,第一次調用獲得參數pdwSize的實際大小;第二次調用獲取pIpForwardTable數據:

Dim mIF As MIB_IPFORWARDTABLE

r = GetIpForwardTable(mIF, dwsize, order)

r = GetIpForwardTable(mIF, dwsize, order)

②調用For…Next循環,獲取每個路由的信息:

For i = 0 To mIF.dwNumEntries - 1

           Realip = inversaip(mIF.table(i).dwForwardDest)

           RealMask = inversaip(mIF.table(i).dwForwardMask)

           Print "ip", Realip

           Print "mask", RealMask

Next

③將長整型格式的ip地址轉換爲標準IP地址格式("xxx.xxx.xxx.xxx"格式):

Private Function inversaip(IPAddrLng As Long) As String

       ‘同本章第九節 4  ③

End Function

 

5、運行時截圖:

 

第十七節 設置TCP連接狀態

1、函數:

①Private Declare Function SetTcpEntry Lib "iphlpapi.dll" (pTcpTable As MIB_TCPROW) As Long

參數說明:

PTcpRow:[輸入]指向MIB_TCPROW類型,這個類型指定了TCP連接的標識,也指定了TCP連接的新狀態。調用者必須指定此類型中所有成員的值。

備註:通常設置爲MIB_TCP_STATE_DELETE_TCB(值爲12)用來斷開某個TCP連接,這也是唯一可在運行時設置的狀態。

返回值:成功,返回0;失敗,返回錯誤代碼。

 

②Private Declare Function GetTcpTable Lib "iphlpapi.dll" (ByRef pTcpTable As MIB_TCPTABLE, ByRef pdwSize As Long, ByVal bOrder As Long) As Long

參看 本章第四節 1

 

2、使用到的類型:

①MIB_TCPTABLE 類型包含Tcp連接表。參看本章第四節 2 ①

 

②MIB_TCPROW 類型包含了TCP連接信息。參看本章第四節 2 ②

 

3、使用到的常量:

Const MIB_TCP_STATE_DELETE_TCB = 12           ‘設置斷開此Tcp連接

 

4、主要代碼分析:

①定義一個MIB_TCPTABLE類型的變量後直接調用GetTcpTable(參看本章第四節 4 ①)

②使用For…Next循環遍歷各個Tcp連接的信息,此時的mtcp.TCP_Table(i) 將作爲設置TCP連接狀態的參數依據(參看本章第四節 4  ②)

For i = 0 To mtcp.dwNum_Of_Entries - 1

Print  mtcp.TCP_Table(i).dwLocalAddr & "->" & mtcp.TCP_Table(i).dwRemoteAddr

Next

③手動輸入要刪除的TCP連接的序號,設置MIB_TCPROW類型的每一個成員的值

TcpIndex = InputBox("接口號", "Del..")

If TcpIndex = "" Then Exit Sub Else TcpIndex = CLng(TcpIndex)

Ttable.dwLocalAddr = mtcp.TCP_Table(TcpIndex).dwLocalAddr

Ttable.dwLocalPort = mtcp.TCP_Table(TcpIndex).dwLocalPort

Ttable.dwRemoteAddr = mtcp.TCP_Table(TcpIndex).dwRemoteAddr

Ttable.dwRemotePort = mtcp.TCP_Table(TcpIndex).dwRemotePort

Ttable.dwState = MIB_TCP_STATE_DELETE_TCB

④調用函數SetTcpEntry斷開對應序號的TCP連接,需要注意的是,斷開系統的連接,即使調用函數顯示成功,但實際並不能斷開系統連接。

r = SetTcpEntry(Ttable)

 

5、運行時截圖:

 

第十八節 在本地電腦的地址解析協議(ARP :Address Resolution Protocol)表中創建和刪除一個ARP

1、函數:

①Private Declare Function CreateIpNetEntry Lib "iphlpapi.dll" (pArpEntry As MIB_IPNETROW) As Long

參數說明:

pArpEntry [輸入] 指向一個指定了新接口信息的MIB_IPNETROW類型,調用者必須爲這個類型指定所有成員的值。

返回值:成功,返回0;失敗,返回錯誤代碼。

 

②Private Declare Function DeleteIpNetEntry Lib "iphlpapi.dll" (pArpEntry As MIB_IPNETROW) As Long

參數說明:

pArpEntry:[輸入] 指向一個MIB_IPNETROW類型。這個類型結構指定了要刪除的接口。調用者至少要爲這個類型指定dwIndex和 dwAddr成員的值。

返回值:成功,返回0;失敗,返回錯誤代碼。

 

③inet_addr是Winsocket的函數而非”iphlpapi.dll”提供的函數,目的是將標準IP地址(”xxx.xxx.xxx.xxx”)的字符串轉爲電腦能識別的長整型的數據。

Private Declare Function inet_addr Lib "wsock32.dll" (ByVal cp As String) As Long

參數說明:

       cp:[輸入] 標準IP地址(”xxx.xxx.xxx.xxx”)的字符串

返回值:成功,返回長整型的數據。

 

2、使用到的類型:

①MIB_IPNETROW 包含地址解析協議(ARP :Address Resolution Protocol)接口信息:

參看 本章 第十節 2 ②

 

3、使用到的常量:

Const MAXLEN_PHYSADDR = 7

 

4、主要代碼分析:

Dim MI As MIB_IPNETROW

 

MI.dwIndex = 2

MI.dwAddr = inet_addr("xxx.xxx.xxx.5")           ‘括號內爲要設置Arp的IP地址

MI.bPhysAddr(0) = 0

MI.bPhysAddr(1) = 80

MI.bPhysAddr(2) = 80

MI.bPhysAddr(3) = 80

MI.bPhysAddr(4) = 80

MI.bPhysAddr(5) = 80

MI.bPhysAddr(6) = 0

MI.bPhysAddr(7) = 0

MI.dwPhysAddrLen = 6

MI.dwType = 3

 

rvalue = CreateIpNetEntry(MI)

 

5、運行時截圖:

第十九節 Ping一個IP地址

1、函數:

①獲得一個Icmp句柄,使ICMP響應能被髮出(以下兩種聲明xp下都可以,但是在2000下要用icmp.dll):

Private Declare Function IcmpCreateFile Lib "iphlpapi.dll" () As Long

Private Declare Function IcmpCreateFile Lib "icmp.dll" () As Long

返回值:成功,返回一個Icmp句柄;失敗,返回0。

 

②發送一條ICMP響應要求, 接着返回回覆(以下兩種聲明xp下都可以,但是在2000下調用動態鏈接庫icmp.dll):

Private Declare Function IcmpSendEcho Lib "icmp.dll" (ByVal IcmpHandle As Long, ByVal DestinationAddress As Long, ByVal RequestData As String, ByVal RequestSize As Long, ByVal RequestOptions As Long, ReplyBuffer As ICMP_ECHO_REPLY, ByVal ReplySize As Long, ByVal Timeout As Long) As Long

Private Declare Function IcmpSendEcho Lib "iphlpapi.dll" (ByVal IcmpHandle As Long, ByVal DestinationAddress As Long, ByVal RequestData As String, ByVal RequestSize As Long, ByVal RequestOptions As Long, ReplyBuffer As ICMP_ECHO_REPLY, ByVal ReplySize As Long, ByVal Timeout As Long) As Long

參數說明:

IcmpHandle:[輸入] 由IcmpCreateFile打開的句柄

DestinationAddress:[輸入] 響應要求的目的地

RequestData:[輸入] 包含要發送的請求數據中的緩存

RequestSize:[輸入] RequestData請求數據緩存的大小,字節

RequestOptions:[輸入] 指向IP頭請求選項的IP_OPTION_INFORMATION類型的指針,可以爲空。

ReplyBuffer:[輸出] 用來保存請求響應的緩存。成功,包含一個類型的陣列,緩存應該足夠大至少保存一個ICMP_ECHO_REPLY類型加上MAXRequestSize(=8) 字節的數據(一個ICMP錯誤信息包含8字節數據)。

ReplySize:[輸出] ReplyBuffer 的大小,字節

Timeout:[輸出] 等待響應時間,毫秒

返回值:成功,返回1,ICMP_ECHO_REPLY類型的數目保存在ReplyBuffer中。每一個響應的狀態包含在此類型。如果返回0,調用GetLastError獲取更多錯誤信息。

 

③關閉一個由IcmpCreateFile獲得的Icmp句柄(以下兩種聲明xp下都可以,但是在2000下要用icmp.dll):

Private Declare Function IcmpCloseHandle Lib "icmp.dll" (ByVal IcmpHandle As Long) As Long

Private Declare Function IcmpCloseHandle Lib "iphlpapi.dll" (ByVal IcmpHandle As Long) As Long

返回值:成功,返回1。

 

④Private Declare Function inet_addr Lib "wsock32.dll" (ByVal cp As String) As Long

參見本章第十八節 1、 ③

 

2、使用到的類型:

①ICMP_ECHO_REPLY 描述了回覆要求的返回響應的數據

Type ICMP_ECHO_REPLY

   address  As Long                  ‘包含正回覆的IP地址

   Status  As Long                    ‘包含回覆的狀態(參看後面的常量部分)

   RoundTripTime  As Long      ‘往返時間RTT(毫秒)

   DataSize  As Integer             ‘回覆數據大小(字節)

   Reserved  As Integer             ‘保留

   ptrData  As Long                  ‘指向回覆數據的指針

   Options  As IP_OPTION_INFORMATION ‘回覆選項

   Data  As String * 250     ‘

End Type

備註:vb和vc關於此類型的聲明不一樣vb多了Dara成員。

 

②IP_OPTION_INFORMATION  描述被包含在IP包頭部的選項

Type IP_OPTION_INFORMATION

   Ttl     As Byte                        ‘生存時間

   Tos    As Byte                        ‘服務類型

   Flags As Byte                        ‘IP頭標誌

   OptionsSize      As Byte          ‘選項數據的大小,字節

   OptionsData     As Long         ‘指向選項數據的指針

End Type

 

3、使用到的常量:

Const ICMP_SUCCESS = 0                                                                 ‘成功

Const ICMP_STATUS_BUFFER_TO_SMALL = 11001                 '緩存太小

Const ICMP_STATUS_DESTINATION_NET_UNREACH = 11002          '目的地網絡不能到達

Const ICMP_STATUS_DESTINATION_HOST_UNREACH = 11003       '目的地主機不能到達

Const ICMP_STATUS_DESTINATION_PROTOCOL_UNREACH = 11004      '目的地協議不能到達

Const ICMP_STATUS_DESTINATION_PORT_UNREACH = 11005       '目的地端口不能到達

Const ICMP_STATUS_NO_RESOURCE = 11006                     '沒有資源

Const ICMP_STATUS_BAD_OPTION = 11007                       '錯誤選項

Const ICMP_STATUS_HARDWARE_ERROR = 11008                 '硬件錯誤

Const ICMP_STATUS_LARGE_PACKET = 11009                    '信息包太大

Const ICMP_STATUS_REQUEST_TIMED_OUT = 11010              '請求超時

Const ICMP_STATUS_BAD_REQUEST = 11011                     '錯誤請求

Const ICMP_STATUS_BAD_ROUTE = 11012                         '錯誤路由

Const ICMP_STATUS_TTL_EXPIRED_TRANSIT = 11013           'TTL終止傳輸

Const ICMP_STATUS_TTL_EXPIRED_REASSEMBLY = 11014          'TTL終止重新組裝

Const ICMP_STATUS_PARAMETER = 11015                         '參數有問題

Const ICMP_STATUS_SOURCE_QUENCH = 11016                    '資源結束

Const ICMP_STATUS_OPTION_TOO_BIG = 11017                  '選項太大

Const ICMP_STATUS_BAD_DESTINATION = 11018                 '錯誤目的地

Const ICMP_STATUS_NEGOTIATING_IPSEC = 11032                '談判IPSEC

Const ICMP_STATUS_GENERAL_FAILURE = 11050                  '常規失敗

 

4、主要代碼分析:

①使用函數IcmpCreateFile創建一個Icmp句柄

IcmpHandle = IcmpCreateFile()

②構築以下參數:定義一個ICMP_ECHO_REPLY類型、目的地IP地址的Long形式、要發送並會返回的數據、數據大小、ICMP_ECHO_REPLY類型的大小、超時設置:

       Dim RBuffer As ICMP_ECHO_REPLY

DAddr = inet_addr("xxx.xxx.xxx.xxx")               ‘括號內爲要Ping的目的地IP地址

RData = "Hi,Hello!"

RequestSize = Len(RData)

ReplySize = Len(RBuffer)

Timeout = 1000

③調用函數IcmpSendEcho:

r = IcmpSendEcho(IcmpHandle, DAddr, RData, RequestSize, 0, RBuffer, ReplySize, Timeout)

Print "狀態", IcmpSta(RBuffer.Status)

Print "Ttl", RBuffer.Options.Ttl

④關閉由IcmpCreateFile獲得的Icmp句柄:

r = IcmpCloseHandle(IcmpHandle)

⑤自定義函數IcmpSta獲得Ping狀態:

Private Function IcmpSta(icmpStatus As Long) As String

Select Case icmpStatus

    Case ICMP_SUCCESS

        IcmpSta = "成功"

    Case ICMP_STATUS_DESTINATION_HOST_UNREACH

        IcmpSta = "目的地主機不能到達"

       Case ……             ‘參看本節中常量的說明

              ……

    Case Else

        IcmpSta = "錯誤信息"

End Select

End Function

 

5、運行時截圖:

第二十節 測定到指定目的地往返時間和跳躍數

1、函數:

①Private Declare Function GetRTTAndHopCount Lib "iphlpapi.dll" (ByVal DestIpAddress As Long, HopCount As Long, MaxHops As Long, RTT As Long) As Long

 

DestIpAddress :[輸入]要測定RTT和跳躍數的目的地IP地址。

HopCount:[輸出] 指向一個ULONG變量。這個變量接收由DestIpAddress參數指定的到目的地的跳躍數。

MaxHops:[輸入] 尋找目的地的最大跳躍數目。如果跳躍數超過這個數目,函數將終止搜尋並返回FALSE。

RTT:[輸出] 到達DestIpAddress指定的目的地的往返時間(Round-trip time),單位毫秒。

返回值:成功返回 1,否則返回0。

 

②Private Declare Function inet_addr Lib "wsock32.dll" (ByVal cp As String) As Long

參見本章第十八節 1、 ③

 

2、使用到的類型:

 

3、使用到的常量:

 

4、主要代碼分析:

①設置目標IP地址,要將“xxx.xxx.xxx.xxx”標準格式轉換爲長整型格式,指定最大跳躍數目,然後直接調用函數GetRTTAndHopCount:

Dip = inet_addr("220.181.27.5")     '這裏是探測www.baidu.com

MaxH = 50

r = GetRTTAndHopCount(Dip, HC, MaxH, RTT)

Print "hopecount", HC

 

5、運行時截圖:

第二十一節 增加和刪除一個IP地址

1、函數:

①Private Declare Function AddIPAddress Lib "iphlpapi.dll" ( ByVal Address As Long, ByVal IpMask As Long, ByVal Ifindex As Long, NTEContext As Long, NTEInstance As Long) As Long

參數說明:

Address:[輸入]要增加的IP地址

IpMask:[輸入]IP地址的子網掩碼

IfIndex:[輸入]增加IP地址的適配器,實際值爲MIB_IPADDRTABLE.table(適配器編號).dwIndex

NTEContext:[輸出]成功則指向一個與這個IP地址關聯的網絡表接口(Net Table Entry:NTE)ULONG變量。調用者可以在稍後使用這個關係到調用DeleteIPAddress。

NTEInstance:[輸出]成功則指向這個IP地址的網絡表接口(Net Table Entry:NTE)實例。

返回值:成功,返回0;失敗,返回錯誤代碼。

備註:①增加的IP是臨時的,當系統重新啓動或者發生其它的PNP事件的時候這個IP就不存在了,比如將網卡禁用,然後啓用,就會發現之前調用函數AddIPAddress增加的的IP地址不存在了。②有時候,調用這個函數,可能造成網絡出錯、系統Arp映射錯誤等,但可以禁用/啓用網卡恢復成正常狀態。。

 

②Private Declare Function DeleteIPAddress Lib "iphlpapi.dll" (ByVal NTEContext As Long) As Long

參數說明:

NTEContext:[輸入] IP地址關聯的網絡表接口(Net Table Entry:NTE),這個關聯是之前用AddIPAddress所創建的,在調用函數GetAdaptersInfo後,從獲得的IP_ADAPTER_INFO. IpAddressList. Context 中也可獲得這個參數的值

返回值:成功,返回0;失敗,返回錯誤代碼。

備註:實際上函數DeleteIPAddress只能刪除由函數AddIPAddress創建的IP地址。

 

③Private Declare Function GetIpAddrTable Lib "iphlpapi.dll" (pIpAddrTable As MIB_IPADDRTABLE, pdwSize As Long, bOrder As Long) As Long

參看本章第九節 1、

 

④Private Declare Function GetAdaptersInfo Lib "iphlpapi.dll" (IpAdapterInfo As Any, pOutBufLen As Long) As Long

參看本章第一節 1、

 

2、使用到的類型:

①MIB_IPADDRTABLE 包含IP地址入口表
參看本章第九節 2、①

②MIB_IPADDRROW 指定特殊IP地址的信息

參看本章第九節 2、②

③IP_ADAPTER_INFO類型:包含本機網絡適配器信息。

參看本章第一節 1、①

④IP_ADDR_STRING描述IP 地址鏈表的節點。

參看本章第一節 1、②

 

3、使用到的常量:

Const MAX_ADAPTER_NAME_LENGTH = 260

Const MAX_ADAPTER_ADDRESS_LENGTH = 8

Const MAX_ADAPTER_DESCRIPTION_LENGTH = 132

 

4、主要代碼分析:

①使用函數GetIpAddrTable獲取某個要增加IP的適配器的dwIndex:

Dim IpAddrTable As MIB_IPADDRTABLE

dwsize = Len(IpAddrTable)

r = GetIpAddrTable(IpAddrTable, dwsize, order)

②傳入IP地址和Mask地址的長整數形式,使用函數AddIPAddress增加地址,返回的NteC 將用於函數DeleteIPAddress,函數的返回值爲0表示成功 :

Addr = inet_addr("192.168.1.5")

IpM = inet_addr("255.255.255.0")

r = AddIPAddress(Addr, IpM, IpAddrTable.table(1).dwIndex, NteC, NteI)

③調用函數DeleteIPAddress,返回值爲0表示成功:

r = DeleteIPAddress(NteC)

 

備註:增加刪除IP地址最好的方法是將Ntec的值記錄下來,如果實在沒有記錄,那麼可以調用函數GetAdaptersInfo獲得網絡適配器信息,然後獲得要刪除的IP地址的網絡接口表:IP_ADDR_STRING.Context,這個值實際就是Ntec的值。

 

5、運行時截圖:

第三章 IPHLPAPI 的其它函數

第一節 IPHLPAPI 的其它函數

IPHLPAPI還有以下的函數,這裏給出C語言的函數原型和參數說明,具體說明詳見MSDN2003。

1、GetAdapterIndex:從名稱獲得一個適配器的序號

DWORD GetAdapterIndex( LPWSTR AdapterName, PULONG IfIndex);

       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;dwForwardPolicy。

返回值:成功,返回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,dwForwardPolicy。

返回值:成功,返回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未被減少到0時,報文到達目標主機,則目標主機返回迴應報文,表示數據可以正常到達。我們可以利用此原理,開始時將TTL設置爲1,然後發出ICMP報,獲得響應,檢驗地址是否是目標主機IP地址,是目標主機的話,表示到達目標主機;不是的話,返回的地址就是最後到達的路由器的地址,然後將TTL設置爲2,重複以上過程,直至TTL設置爲255。

在這個例子中,將使用第二章第十九節所用到的函數、類型及常量(請參看第二章第十九節中的介紹),但對IcmpSendEcho函數聲明作一點變化。

Private Declare Function IcmpSendEcho Lib "icmp.dll" ( _

    ByVal IcmpHandle As Long, ByVal DestinationAddress As Long, _

    ByVal RequestData As String, ByVal RequestSize As Long, _

    RequestOptions As IP_OPTION_INFORMATION, ReplyBuffer As ICMP_ECHO_REPLY, _

ByVal ReplySize As Long, ByVal Timeout As Long) As Long

其中RequestOptions是指向IP頭請求選項的IP_OPTION_INFORMATION類型的指針,可以爲空。如果沒有具體的要求,那麼就設置爲Long,在調用的時候傳0;如果要設定IP頭請求選項,那麼這裏設置爲IP_OPTION_INFORMATION類型,在調用的時候傳定義爲IP_OPTION_INFORMATION類型的變量。

主要代碼如下:

Dim RBuffer As ICMP_ECHO_REPLY

Dim pIOI As IP_OPTION_INFORMATION

Dim Realip As String

 

IcmpHandle = IcmpCreateFile()    ‘創建一個Icmp句柄

RData = "Hi,Hello!"               ‘

RequestSize = Len(RData)            ‘

DAddr = inet_addr(Trim(Text1.Text))         ‘目標機IP地址的長整數形式

Timeout = 1000                          ‘超時設置,毫秒

ReplySize = Len(RBuffer)            ‘

 

For i = 1 To 255

    pIOI.Ttl = I                         ‘設置TTL值

    DoEvents

    r = IcmpSendEcho(IcmpHandle, DAddr, RData, RequestSize, pIOI, RBuffer, ReplySize + 8, Timeout)                                             ‘發送Icmp報文

    DoEvents

    If r <> 1 Then List1.AddItem "錯誤,終止": Exit For        ‘檢測是否出錯

    Realip = inversaip(RBuffer.Address)                   ‘將長整型IP轉爲點數格式字符串IP

    List1.AddItem i & " IP " & Realip & ":" & RBuffer.RoundTripTime & "ms"

    If Realip = Trim(Text1.Text) Then Exit For         ‘比較IP地址,如果相同則到達目標主機

Next

r = IcmpCloseHandle(IcmpHandle)       ‘關閉Icmp句柄

 

程序運行時截圖:

第五章 結束語

Windows自身提供了一些在命令提示符下操作的命令可以獲得網絡信息,比如Ipconfig、Arp等,都可以使用Iphlpapi.dll的函數來獲得同樣效果,我們可以使用Iphlpapi函數來製作自己的Ipconfig程序、Arp程序或者別的程序。

以上總結了Iphlpapi.dll所提供大部分函數,雖然以上函數詳細的說明和應用都是對Vb程序員的,但是也不失爲C程序員的輔助資料。文章中所附代碼均是源程序的關鍵代碼,源程序附文後。由於各人的電腦網絡情況不一(比如我的電腦就是通過局域網上網的),所附源代碼的某些參數是與我的網絡情況一致的,請認真查看源代碼後,將參數修改成與自己的網絡情況一致在做調用。另外,源代碼中也未做防錯處理,這個也需要注意。

Iphlpapi.dll函數極大的方便了程序員瞭解網絡連接的信息,而且Iphlpapi.dll所提供的函數、功能也在不斷增加中,相信在以後的程序開發中,程序員們會更多的使用這個有用的動態鏈接庫。

有意見和建議,請發送郵件到[email protected],我將盡力解答。

 

 

參考資料:①Microsft  MSDN 2003

          ②《IP Helper API 使用方法詳解》 作者:劉巍

編程環境:WinXp(sp1)+vb6.0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章