在程式中 Ping 某 IP 或 主機 連線狀態
如何在程式中 Ping 某 IP 或 主機 連線狀態
方法1 :
使用WMI NetDiagnostics
Private Sub cmdPing_Click()
MsgBox Ping("PowerHammer") ' Ping 機器(電腦)名稱
MsgBox Ping("168.95.1.1") ' Ping IP
MsgBox Ping("www.google.com.tw") ' Ping 網站 ( 回傳成功 )
MsgBox Ping("blog.blueshop.com.tw/hammerchou/") ' Ping 網站 ( 回傳失敗 )
End Sub
Private Function Ping(strAddr As String) As String
Dim blnOK As Boolean
blnOK = GetObject("winmgmts:").Get("NetDiagnostics=@").Ping(strAddr, Ping)
' blnOK = True 為 Ping 成功 , 反之則為失敗
Ping = Replace(Ping, "<br>", vbCrLf, 1, , 1) ' Ping 的結果
End Function
================================================================
方法2 :
使用WMI NetDiagnostics
Private Sub cmdPing2_Click()
Dim strMachine As String
Dim objWMIsvc As Object, objCls As Object
Dim objInPara As Object, objOutPara As Object
strMachine = "." ' 本機
' root\CIMV2 為 Namespace
Set objWMIsvc = GetObject("winmgmts:\\" & strMachine & "\root\CIMV2")
' NetDiagnostics 為 Class
Set objCls = objWMIsvc.Get("NetDiagnostics")
' 設定 "輸入" 參數
Set objInPara = objCls.Methods_("Ping").inParameters.SpawnInstance_()
objInPara.Properties_("sInAddr") = "www.google.com.tw" ' 設定 Ping 的位置
' Ping 為 方法 , ExecMethod 為 執行方法 ( 把參數送入執行 )
Set objOutPara = objWMIsvc.ExecMethod("NetDiagnostics=@" , "Ping", objInPara)
' 取回輸出參數 ( Ping 的結果 )
' objOutPara.ReturnValue = True 則 Ping 成功 , 反之則失敗
MsgBox Replace(objOutPara.sOutArg, "<br>", vbCrLf, 1, -1, vbTextCompare) ' 回傳 Ping 後的結果訊息
End Sub
================================================================
方法3 :
使用WMI Win32_PingStatus
Private Sub cmdPing3_Click()
Dim strAddr As String, strResult As String
Dim objPing As Object, objStatus As Object
strAddr = "www.google.com.tw" ' 設定 Ping 的位置
' 執行查詢 Win32_PingStatus 類別
Set objPing = GetObject("winmgmts:").ExecQuery _
("Select * from Win32_PingStatus where Address = '" & strAddr & "'")
For Each objStatus In objPing
With objStatus
If IsNull(.StatusCode) Or .StatusCode <> 0 Then ' 失敗
strResult = "Address : " & strAddr & " is not reachable (not responding) .."
Else ' 成功
strResult = "Pinging " & strAddr & _
IIf(strAddr = .ProtocolAddress, "", " [" & .ProtocolAddress & "] ") & vbCrLf & _
"Bytes=" & .BufferSize & " Time=" & .ResponseTime & "ms TTL=" & .ResponseTimeToLive
' 取得 通訊位置 , 緩衝區大小 , 反應時間 , 封包在網路上存活時間 等資訊..
End If
End With
Next
MsgBox strResult ' 回傳 Ping 後的結果訊息
End Sub
================================================================
方法4 :
呼叫 Windows 外部 Ping 指令
Private Sub cmdPing4_Click()
MsgBox PingIP("PowerHammer") ' 設定 Ping 的位置 或 電腦名稱 或 網址
End Sub
Private Function PingIP(strAddr As String) As String
Dim strTmpFile As String
strTmpFile = Environ("TEMP") & "\PingResult.txt" ' 準備建暫存檔在 Windows Temp 目錄下
' 建立 WScript 物件 Shell 類別 , 使用 Run 方法 , 呼叫外部指令 Ping ( 並等待其執行結束 )
CreateObject("WScript.Shell").Run Environ("COMSPEC") & " /c PING " & strAddr & " > " & strTmpFile, 0, True
' PS : "Ping IP位置 > XX檔案" 這裡是使用 > 來將 Ping 結果寫到檔案裡
( 當然也可 Call API CreatePipe 來讀取命令結果 )
' Ping 是一種公用程式,可以驗證一或多個遠端主機連線。
' Ping 指令用 ICMP 回應要求和回應回覆套裝軟體來決定網路上的特殊 IP 系統是否正常運作。
' Ping 對診斷 IP 網路或路由器失敗非常有用。
' Internet Control Message Protocol (ICMP)
' TCP/IP 組件中必要的一種維護通訊協定,可報告錯誤並允許簡易連線。
' Ping 工具用來執行 TCP/IP 疑難排解的 ICMP。
' 詳細說明及用法可參考:
' ms-its:%WINDIR%\Help\ntcmds.chm::/ping.htm
' ms-its:%WINDIR%\Help\ntcmds.chm::/ping.htm
' ms-its:%WINDIR%\Help\tcpip.chm::/sag_TCPIP_pro_PingConnect.htm
' ms-its:%WINDIR%\Help\tcpip.chm::/sag_TCPIP_pro_Ping.htm
' 建立檔案系統物件,用來開啟暫存文字檔,並讀取內容 ( 取回 Ping的結果 )
PingIP = CreateObject("Scripting.FileSystemObject").OpenTextFile(strTmpFile).ReadAll
PingIP = Replace(PingIP, vbCrLf, "", 1)
On Error Resume Next
Kill strTmpFile ' 3除暫存檔
End Function
================================================================
方法5 :
也可呼叫底下幾組 API , 詳細內容不列了..
' API 宣告
Private Declare Function WSAStartup Lib "wsock32.dll" _
(ByVal wVersionRequired&, lpWSAdata As WSAdata) As Long
Private Declare Function WSACleanup Lib "wsock32.dll" () As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Declare Function IcmpCreateFile Lib "icmp.dll" () As Long
Private Declare Function IcmpCloseHandle Lib "icmp.dll" (ByVal HANDLE As Long) As Boolean
Private Declare Function IcmpSendEcho Lib "ICMP" _
(ByVal IcmpHandle As Long, ByVal DestAddress As Long, _
ByVal RequestData As String, ByVal RequestSize As Integer, _
RequestOptns As IP_OPTION_INFORMATION, ReplyBuffer As IP_ECHO_REPLY, _
ByVal ReplySize As Long, ByVal TimeOut As Long) As Boolean
================================================================
PS : 亦可使用3rd Party 所出的 ActiveX component 來進行 Ping Host 功能 ! ( 如 : ASPPING.DLL)
================================================================
VB.Net 寫法 :
使用WMI NetDiagnostics
請先加入參考 System.Management
Imports System.Management
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click
MessageBox.Show (Ping("168.95.1.1")) ' Ping IP
End Sub
Private Function Ping(ByVal strAddress As String) As String
' 初始化 ManagementObject 類別的新執行個體 (Instance)。
' root\CIMV2 為 Namespace , NetDiagnostics 為 Class , =@ 為帶參數
Dim objCls As New ManagementObject("root\CIMV2", "NetDiagnostics=@", Nothing)
' ManagementBaseObject 管理物件的基本類別 , 用GetMethodParameters 方法取得輸入參數
Dim objInPara As ManagementBaseObject = objCls.GetMethodParameters("Ping")
objInPara("sInAddr") = strAddress ' 設定輸入參數 ( IP , 電腦名稱 或 網址 )
' 在物件上叫用方法 ( Ping ) , 並傳入引數 ( 參數物件 ) , 再取得 sOutArg 輸出引數 (參數)
Ping = objCls.InvokeMethod("Ping", objInPara, Nothing)!sOutArg.Replace("<br>", vbCrLf)
' .Replace("<br>", vbCrLf) : 把 <br> 轉成折行
End Function