Лучший отвечающий
Ping серверов в C#

Вопрос
-
Здравствуйте!
Нужна простая консольная программа, котороя проверяла бы доступность нескольких серверов.
На 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; }
>> И еще вопрос, можно ли посылать несколько пакетов для проверки или нужно просто повторять функцию в цикле для каждого сервера?
Вот тут можно поподробней, не совсем понятно что именно вы имеете ввиду.
- Изменено Alexandr Gashper 17 февраля 2012 г. 7:08
17 февраля 2012 г. 7:07 -
Добрый день! Можете подсказать, как переделать данный код, под форму, а именно: на форме имеется кнопка, при нажатии на которую будут выполняться пинги до серверов?31 октября 2021 г. 19:33
-
Добрый день! Можете подсказать, как переделать данный код, под форму, а именно: на форме имеется кнопка, при нажатии на которую будут выполняться пинги до серверов?
Запись всё так же будет происходить в txt.31 октября 2021 г. 19:34