none
Ping серверов в C# RRS feed

  • Вопрос

  • Здравствуйте!

    Нужна простая консольная программа, котороя проверяла бы доступность нескольких серверов.

    На msdn нашел пример, который немного переработал под себя... но в нём пингуется только один сервер, а как сделать чтобы последовательно пинговалось несколько серверов? Помогите пожалуйста, т.к. пока я не силен в этом. И если можно подскажите как весь вывод сохранять в лог?

    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)
            {
                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);
    
                // Send the ping asynchronously.
                // Use the waiter as the user token.
                // When the callback completes, it can wake up this thread.
                string serv;
    				serv = "192.168.0.250";
    			
    			pingSender.SendAsync(serv, timeout, buffer, options, waiter);
    
                // Prevent this example application from ending.
                // A real application should do something useful
                // when possible.
                waiter.WaitOne ();
            }
    
            private 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 ("Состояние связи: {0}", reply.Status);
                if (reply.Status == IPStatus.Success)
                {
                    Console.WriteLine ("Адрес сервера: {0}", reply.Address.ToString ());
                    Console.WriteLine ("Время отклика сервера: {0}", reply.RoundtripTime);
                }
            }
        }
    }


    • Изменено Pirr2004 9 февраля 2012 г. 8:01
    9 февраля 2012 г. 7:59

Ответы

  • Добрый день.

    Если вам нужно пинговать сервера последовательно, то можно сделать это проще ( + запись в лог ):

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.NetworkInformation;
    using System.IO;
     
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<string> serversList = new List<string>();
                serversList.Add("microsoft.com");
                serversList.Add("google.com");
                serversList.Add("192.168.1.1");
     
     
                using (TextWriter tw = new StreamWriter("d:\\MyLog.txt"))
                {
                    Ping ping = new System.Net.NetworkInformation.Ping();
                    PingReply pingReply = null;
     
                    foreach (string server in serversList)
                    {
                        pingReply = ping.Send(server);
     
                        if (pingReply.Status != IPStatus.TimedOut)
                        {
                            tw.WriteLine(server); //server
                            tw.WriteLine(pingReply.Address); //IP
                            tw.WriteLine(pingReply.Status); //Статус
                            tw.WriteLine(pingReply.RoundtripTime); //Время ответа
                            tw.WriteLine(pingReply.Options.Ttl); //TTL
                            tw.WriteLine(pingReply.Options.DontFragment); //Фрагментирование
                            tw.WriteLine(pingReply.Buffer.Length); //Размер буфера
                            tw.WriteLine();
                        }
                        else
                        {
                            tw.WriteLine(server); //server
                            tw.WriteLine(pingReply.Status);
                            tw.WriteLine();
                        }
            	}
                }
     
                Console.ReadKey();
            }
        }
    }


    • Изменено Alexandr Gashper 9 февраля 2012 г. 8:55
    • Помечено в качестве ответа Abolmasov Dmitry 9 февраля 2012 г. 9:34
    9 февраля 2012 г. 8:54

Все ответы

  • Добрый день.

    Если вам нужно пинговать сервера последовательно, то можно сделать это проще ( + запись в лог ):

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.NetworkInformation;
    using System.IO;
     
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<string> serversList = new List<string>();
                serversList.Add("microsoft.com");
                serversList.Add("google.com");
                serversList.Add("192.168.1.1");
     
     
                using (TextWriter tw = new StreamWriter("d:\\MyLog.txt"))
                {
                    Ping ping = new System.Net.NetworkInformation.Ping();
                    PingReply pingReply = null;
     
                    foreach (string server in serversList)
                    {
                        pingReply = ping.Send(server);
     
                        if (pingReply.Status != IPStatus.TimedOut)
                        {
                            tw.WriteLine(server); //server
                            tw.WriteLine(pingReply.Address); //IP
                            tw.WriteLine(pingReply.Status); //Статус
                            tw.WriteLine(pingReply.RoundtripTime); //Время ответа
                            tw.WriteLine(pingReply.Options.Ttl); //TTL
                            tw.WriteLine(pingReply.Options.DontFragment); //Фрагментирование
                            tw.WriteLine(pingReply.Buffer.Length); //Размер буфера
                            tw.WriteLine();
                        }
                        else
                        {
                            tw.WriteLine(server); //server
                            tw.WriteLine(pingReply.Status);
                            tw.WriteLine();
                        }
            	}
                }
     
                Console.ReadKey();
            }
        }
    }


    • Изменено Alexandr Gashper 9 февраля 2012 г. 8:55
    • Помечено в качестве ответа Abolmasov Dmitry 9 февраля 2012 г. 9:34
    9 февраля 2012 г. 8:54
  • Спасибо Александр!

    Это действительно, проще и как раз то что нужно!

    9 февраля 2012 г. 9:14
  • Уже модифицировал код под себя, навешал плюшек, всё замечательно.

    Вот заметил проблемку... если задать имена серверов по IP то все хорошо, а если по имени то программа отрабатывается успешно только там где эти сервера реально имеются в DNS, в сети где таких имен нет программа выдает исключение.

    И еще вопрос, можно ли посылать несколько пакетов для проверки или нужно просто повторять функцию в цикле для каждого сервера?

    9 февраля 2012 г. 11:24
  •  >> Вот заметил проблемку... если задать имена серверов по IP то все хорошо, а если по имени то программа отрабатывается
     >> успешно только там где    эти сервера реально имеются в DNS, в сети где таких имен нет программа выдает исключение.

    Само собой, если нельзя получить адрес по имени то и пинговать не выйдет :) Обрабатывайте исключение и пишите в лог результат.

    Или пробуйте сами резолвить имена, например так:

                try
                {
                    IPHostEntry hostInfo = Dns.Resolve(server);
                }
                catch (Exception ee)
                {
                    tw.WriteLine("опаньки...");
                    tw.WriteLine(server); //server
                    tw.WriteLine(ee.Message);
                    tw.WriteLine();
                    continue;
                }


     >> И еще вопрос, можно ли посылать несколько пакетов для проверки или нужно просто повторять функцию в цикле для каждого сервера?

    Вот тут можно поподробней, не совсем понятно что именно вы имеете ввиду.



    17 февраля 2012 г. 7:07
  • Добрый день! Можете подсказать, как переделать данный код, под форму, а именно: на форме имеется кнопка, при нажатии на которую будут выполняться пинги до серверов?
    31 октября 2021 г. 19:33
  • Добрый день! Можете подсказать, как переделать данный код, под форму, а именно: на форме имеется кнопка, при нажатии на которую будут выполняться пинги до серверов?
    Запись всё так же будет происходить в txt. 
    31 октября 2021 г. 19:34