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 " + strIP + " -n 5");
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 
pingrst = strRst;
p.Close();
return pingrst;
}

解决方案 »

  1.   

    使用System.Net.NetworkInformation.Ping类示例:下面的代码示例演示如何同步使用 Ping 类。
    using System;
    using System.Net;
    using System.Net.NetworkInformation;
    using System.Text;namespace Examples.System.Net.NetworkInformation.PingTest
    {
        public class PingExample
        {
            // args[0] can be an IPaddress or host name.
            public static void Main (string[] args)
            {
                Ping pingSender = new Ping ();
                PingOptions options = new PingOptions ();            // Use the default Ttl value which is 128,
                // but change the fragmentation behavior.
                options.DontFragment = true;            // Create a buffer of 32 bytes of data to be transmitted.
                string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
                byte[] buffer = Encoding.ASCII.GetBytes (data);
                int timeout = 120;
                PingReply reply = pingSender.Send (args[0], timeout, buffer, options);
                if (reply.Status == IPStatus.Success)
                {
                    Console.WriteLine ("Address: {0}", reply.Address.ToString ());
                    Console.WriteLine ("RoundTrip time: {0}", reply.RoundtripTime);
                    Console.WriteLine ("Time to live: {0}", reply.Options.Ttl);
                    Console.WriteLine ("Don't fragment: {0}", reply.Options.DontFragment);
                    Console.WriteLine ("Buffer size: {0}", reply.Buffer.Length);
                }
            }
        }
    }
    下面的代码示例演示如何异步使用 Ping 类。using System;
    using System.Text;
    using System.Net;
    using System.Net.NetworkInformation;
    using System.ComponentModel;
    using System.Threading;namespace Examples.System.Net.NetworkInformation.PingTest
    {
        public class PingExample
        {
            public static void Main (string[] args)
            {
                if (args.Length == 0)
                    throw new ArgumentException ("Ping needs a host or IP Address.");            string who = args[0];
                AutoResetEvent waiter = new AutoResetEvent (false);            Ping pingSender = new Ping ();            // When the PingCompleted event is raised,
                // the PingCompletedCallback method is called.
                pingSender.PingCompleted += new PingCompletedEventHandler (PingCompletedCallback);            // Create a buffer of 32 bytes of data to be transmitted.
                string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
                byte[] buffer = Encoding.ASCII.GetBytes (data);            // Wait 12 seconds for a reply.
                int timeout = 12000;            // Set options for transmission:
                // The data can go through 64 gateways or routers
                // before it is destroyed, and the data packet
                // cannot be fragmented.
                PingOptions options = new PingOptions (64, true);            Console.WriteLine ("Time to live: {0}", options.Ttl);
                Console.WriteLine ("Don't fragment: {0}", options.DontFragment);            // Send the ping asynchronously.
                // Use the waiter as the user token.
                // When the callback completes, it can wake up this thread.
                pingSender.SendAsync(who, timeout, buffer, options, waiter);            // Prevent this example application from ending.
                // A real application should do something useful
                // when possible.
                waiter.WaitOne ();
                Console.WriteLine ("Ping example completed.");
            }        public static void PingCompletedCallback (object sender, PingCompletedEventArgs e)
            {
                // If the operation was canceled, display a message to the user.
                if (e.Cancelled)
                {
                    Console.WriteLine ("Ping canceled.");                // Let the main thread resume. 
                    // UserToken is the AutoResetEvent object that the main thread 
                    // is waiting for.
                    ((AutoResetEvent)e.UserState).Set ();
                }            // If an error occurred, display the exception to the user.
                if (e.Error != null)
                {
                    Console.WriteLine ("Ping failed:");
                    Console.WriteLine (e.Error.ToString ());                // Let the main thread resume. 
                    ((AutoResetEvent)e.UserState).Set();
                }            PingReply reply = e.Reply;            DisplayReply (reply);            // Let the main thread resume.
                ((AutoResetEvent)e.UserState).Set();
            }        public static void DisplayReply (PingReply reply)
            {
                if (reply == null)
                    return;            Console.WriteLine ("ping status: {0}", reply.Status);
                if (reply.Status == IPStatus.Success)
                {
                    Console.WriteLine ("Address: {0}", reply.Address.ToString ());
                    Console.WriteLine ("RoundTrip time: {0}", reply.RoundtripTime);
                    Console.WriteLine ("Time to live: {0}", reply.Options.Ttl);
                    Console.WriteLine ("Don't fragment: {0}", reply.Options.DontFragment);
                    Console.WriteLine ("Buffer size: {0}", reply.Buffer.Length);
                }
            }
        }
    }