1. 程式人生 > >c#如何檢查區域網內伺服器是否連通(呼叫外部Ping命令獲取網路連線情況)

c#如何檢查區域網內伺服器是否連通(呼叫外部Ping命令獲取網路連線情況)

使用C#呼叫外部Ping命令獲取網路連線情況

以前在玩Windows 98的時候,幾臺電腦連起來,需要測試網路連線是否正常,經常用的一個命令就是Ping.exe。感覺相當實用。

現在 .net為我們提供了強大的功能來呼叫外部工具,並通過重定向輸入、輸出獲取執行結果,下面就用一個例子來說明呼叫Ping.exe命令實現網路的檢測,希望對.net初學者有所幫助。

首先,我們用使用Process類,來建立獨立的程序,匯入System.Diagnostics,

using System.Diagnostics;

例項一個Process類,啟動一個獨立程序

Process p = new Process();

Process類有一個StartInfo屬性,這個是ProcessStartInfo類,包括了一些屬性和方法,

下面我們用到了他的幾個屬性:

設定程式名

p.StartInfo.FileName = "cmd.exe";

關閉Shell的使用

p.StartInfo.UseShellExecute = false;

重定向標準輸入

p.StartInfo.RedirectStandardInput = true;

重定向標準輸出

p.StartInfo.RedirectStandardOutput = true;

重定向錯誤輸出

p.StartInfo.RedirectStandardError = true;

設定不顯示視窗

p.StartInfo.CreateNoWindow = true;

上面幾個屬性的設定是比較關鍵的一步。

既然都設定好了那就啟動程序吧,

p.Start();

輸入要執行的命令,這裡就是ping了,

p.StandardInput.WriteLine("ping -n 1 192.192.132.229");

p.StandardInput.WriteLine("exit");

從輸出流獲取命令執行結果,

string strRst = p.StandardOutput.ReadToEnd();

在本機測試得到如下結果:

"Microsoft Windows 2000 [Version 5.00.2195]/r/n(C) 版權所有 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"

有了輸出結果,那還有什麼好說的,分析strRst字串就可以知道網路的連線情況了。

下面是一個完整的程式,當然對Ping.exe程式執行的結果不全,讀者可以進一步修改

完整程式碼如下:

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;

                }

        }

    }

總結,這裡就是為了說明一個問題,不但是Ping命令,只要是命令列程式或者是Dos內部命令,我們都可以用上面的方式來執行它,並獲取相應的結果,並且這些程式的執行過程不會顯示出來,如果需要呼叫外部程式就可以嵌入到其中使用了。

< type = text / javascript > function ImgZoom(Id) //重新設定圖片大小 防止撐破錶格 { var w = $(Id).width; var m = 550; if(w < m) { return; } else { var h = $(Id).height; $(Id).height = parseInt(h*m/w); $(Id).width = m; } } window.onload = function() { var Imgs = $("content").getElementsByTagName("img"); var i=0; for(;i =========================================================================================

         //以下程式碼可能更容易操作。

         using   System.Diagnostics;
public   static   string   CmdPing(string   _strHost)
    {
    string   m_strHost   =   _strHost;

    Process   process   =   new   Process();
    process.StartInfo.FileName   =   "cmd.exe";
    process.StartInfo.UseShellExecute   =   false;
    process.StartInfo.RedirectStandardInput   =   true;
    process.StartInfo.RedirectStandardOutput   =   true;
    process.StartInfo.RedirectStandardError   =   true;
    process.StartInfo.CreateNoWindow   =   true;
    string   pingrst   =   string.Empty;
    process.StartInfo.Arguments   =   "ping   "   +   m_strHost   +   "   -n   1";
    process.Start();
    process.StandardInput.AutoFlush   =   true;
    string   temp   =   "ping   "   +   m_strHost   +   "   -n   1"   ;
    process.StandardInput.WriteLine(temp);
    process.StandardInput.WriteLine("exit");
    string   strRst   =   process.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;
    process.Close();
    return   pingrst   ;
    }

private   void   button1_Click(object   sender,   System.EventArgs   e)
    {
    string   str   =   CmdPing("192.168.1.100");
    MessageBox.Show(str);
    }