在程式中 Ping 某 IP 或 主機 連線狀態

在程式中 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