使用C#調(diào)用外部Ping命令取得網(wǎng)絡(luò)連接情況
發(fā)表時間:2024-02-08 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]以前在玩Windows 98的時候,幾臺電腦連起來,需要測試網(wǎng)絡(luò)連接是否正常,經(jīng)常用的一個命令就是Ping.exe。感覺相當實用。 現(xiàn)在 .net為我們提供了強大的功能來調(diào)用外部工具,并通過重定向輸入、輸出獲取執(zhí)行結(jié)果,下面就用一個例子來說明調(diào)用Ping.exe命令實現(xiàn)網(wǎng)絡(luò)的檢測,希望對.net初...
以前在玩Windows 98的時候,幾臺電腦連起來,需要測試網(wǎng)絡(luò)連接是否正常,經(jīng)常用的一個命令就是Ping.exe。感覺相當實用。
現(xiàn)在 .net為我們提供了強大的功能來調(diào)用外部工具,并通過重定向輸入、輸出獲取執(zhí)行結(jié)果,下面就用一個例子來說明調(diào)用Ping.exe命令實現(xiàn)網(wǎng)絡(luò)的檢測,希望對.net初學者有所幫助。
首先,我們用使用Process類,來創(chuàng)建獨立的進程,導(dǎo)入System.Diagnostics,
using System.Diagnostics;
實例一個Process類,啟動一個獨立進程
Process p = new Process();
Process類有一個StartInfo屬性,這個是ProcessStartInfo類,包括了一些屬性和方法,
下面我們用到了他的幾個屬性:
設(shè)定程序名
p.StartInfo.FileName = "cmd.exe";
關(guān)閉Shell的使用
p.StartInfo.UseShellExecute = false;
重定向標準輸入
p.StartInfo.RedirectStandardInput = true;
重定向標準輸出
p.StartInfo.RedirectStandardOutput = true;
重定向錯誤輸出
p.StartInfo.RedirectStandardError = true;
設(shè)置不顯示窗口
p.StartInfo.CreateNoWindow = true;
上面幾個屬性的設(shè)置是比較關(guān)鍵的一步。
既然都設(shè)置好了那就啟動進程吧,
p.Start();
輸入要執(zhí)行的命令,這里就是ping了,
p.StandardInput.WriteLine("ping -n 1 192.192.132.229");
p.StandardInput.WriteLine("exit");
從輸出流獲取命令執(zhí)行結(jié)果,
string strRst = p.StandardOutput.ReadToEnd();
在本機測試得到如下結(jié)果:
"Microsoft Windows 2000 [Version 5.00.2195]\r\n(C) 版權(quán)所有 1985-2000 Microsoft Corp.\r\n\r\nD:\\himuraz\\csharpproject\\ZZ\\ConsoleTest\\bin\\Debug>ping -n 1 192.192.132.231\r\n\r\r\nPinging 192.192.132.231 with 32 bytes of data:\r\r\n\r\r\nReply from 192.192.132.231: bytes=32 time<10ms TTL=128\r\r\n\r\r\nPing statistics for 192.192.132.231:\r\r\n Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),\r\r\nApproximate round trip times in milli-seconds:\r\r\n Minimum = 0ms, Maximum = 0ms, Average = 0ms\r\r\n\r\nD:\\himuraz\\csharpproject\\ZZ\\ConsoleTest\\bin\\Debug>exit\r\n"
有了輸出結(jié)果,那還有什么好說的,分析strRst字符串就可以知道網(wǎng)絡(luò)的連接情況了。
下面是一個完整的程序,當然對Ping.exe程序執(zhí)行的結(jié)果不全,讀者可以進一步修改
完整代碼如下:
using System;
using System.Diagnostics;
namespace ZZ
{
class ZZConsole
{
[STAThread]
static void Main(string[] args)
{
string ip = "192.192.132.229";
string strRst = CmdPing(ip);
Console.WriteLine(strRst);
Console.ReadLine();
}
private static string CmdPing(string strIp)
{
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
string pingrst;
p.Start();
p.StandardInput.WriteLine("ping -n 1 "+strIp);
p.StandardInput.WriteLine("exit");
string strRst = p.StandardOutput.ReadToEnd();
if(strRst.IndexOf("(0% loss)")!=-1)
pingrst = "連接";
else if( strRst.IndexOf("Destination host unreachable.")!=-1)
pingrst = "無法到達目的主機";
else if(strRst.IndexOf("Request timed out.")!=-1)
pingrst = "超時";
else if(strRst.IndexOf("Unknown host")!=-1)
pingrst = "無法解析主機";
else
pingrst = strRst;
p.Close();
return pingrst;
}
}
}
總結(jié),這里就是為了說明一個問題,不但是Ping命令,只要是命令行程序或者是Dos內(nèi)部命令,我們都可以用上面的方式來執(zhí)行它,并獲取相應(yīng)的結(jié)果,并且這些程序的執(zhí)行過程不會顯示出來,如果需要調(diào)用外部程序就可以嵌入到其中使用了。