Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/41: Рейтинг темы: голосов - 41, средняя оценка - 4.78
 Аватар для OpenGoodwin
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459

Ping IP-адреса и отклик

04.01.2015, 03:48. Показов 8817. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Хочу написать программку, которая проверяет доступность игрового сервера. Есть 4 IP-адреса, и если они дают отклик, то сервер, соответственно, будет доступен. Какими средствами это сделать?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.01.2015, 03:48
Ответы с готовыми решениями:

Отклик меню
Всем привет! Проблема: меню не откликается с первого раза, после утери фокуса формой. То есть, у нас есть простая форма(скрин...

WCF службы и поздний отклик
В общем проблема, хотя я пока не знаю проблема ли это разбираюсь с WCF концепция очень простая и без меня сами все знаете (я не говорю о...

Ping адреса
Пытаюсь пингануть адрес следующим образом, с помощью IdIcmpClient IdIcmpClient1.Host:='192.168.33.131'; IdIcmpClient1.Ping(); Выдает...

4
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18288 / 14211 / 5368
Регистрация: 17.03.2014
Сообщений: 28,889
Записей в блоге: 1
04.01.2015, 12:13
System.Net.NetworkInformation.Ping
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.01.2015, 14:42
OpenGoodwin, может вот так поможет?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Net.NetworkInformation;
 
namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            if (CheckServers("www.yandex.ru", "www.goole.com", "www.mail.ru")) {
                Console.WriteLine("Success!");
            }
            else {
                Console.WriteLine("Fail!");
            }
            Console.ReadLine();
        }
        static bool CheckServers(params string[] uris) {
            if (uris.Length == 0) {
                throw new ArgumentNullException("uris");
            }
            var result = from uri in uris.AsParallel()
                         .WithDegreeOfParallelism(uris.Length)
                         let p = new Ping().Send(uri)
                         select new {
                             uri,
                             p.Status
                         };
            foreach (var r in result) {
                if (r.Status == IPStatus.TimedOut)
                    return false;
            }
            return true;
        }
    }
}
Это в консоли, но можно использовать в форме.
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18288 / 14211 / 5368
Регистрация: 17.03.2014
Сообщений: 28,889
Записей в блоге: 1
04.01.2015, 23:03
Лучший ответ Сообщение было отмечено OpenGoodwin как решение

Решение

insite2012, хороший пример, но есть есть пара моментов которые стоит исправить:

1) Ping.Send() отправляет только один ping и может случайно получится что он не дойдет. Надежнее отправить несколько и смотреть был ли хотя бы один успешный.

2) Код проверки исходит из того что ошибка это только таймаут, когда их больше. Плюс не хватает обработки исключений.

Из мелких моментов я бы отметил неуместное использование ArgumentNullException и неудачное имя аргумента uris. В первом случае лучше использовать ArgumentException т.к. uris != null. Во втором, взял бы такое же имя как у метода Ping.Send() - hostNameOrAddress - потому что мы не передаем URI. URI включает протокол в себя.

В итоге код примерно такой. Я сохранил PLINQ потому что он мне здесь очень нравится.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static bool AreAllAvailable(params string[] hostNameOrAddresses)
{
    if (hostNameOrAddresses == null) throw new ArgumentNullException("hostNameOrAddresses");
    if (hostNameOrAddresses.Length == 0) throw new ArgumentException("hostNameOrAddresses must have at least one element", "hostNameOrAddresses");
    
    var result = from hostNameOrAddress in hostNameOrAddresses.AsParallel().WithDegreeOfParallelism(hostNameOrAddresses.Length)
                    let p = new MultiplePing().Send(hostNameOrAddress)
                    select new {
                        HostNameOrAddress = hostNameOrAddress,
                        p.AllFailed
                    };
    try
    {           
        return !result.Any(r => r.AllFailed);
    }
    catch (AggregateException ex)
    {
        // Игнорируем PingException. Остальным даем выйти наружу.
        ex.Handle(_ => _.GetType() == typeof(PingException));
    }
    return false;
}
Классы MultiplePing и MultiplePingReply
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
class MultiplePing
{
    readonly int _repeat;
    static byte[] defaultPingData;
    const int TIMEOUT_MS = 5000;
    const int PAUSE_MS = 500;
 
    static MultiplePing()
    {
        defaultPingData = new byte[32];
        for (int i = 0; i < defaultPingData.Length; i++)
            defaultPingData[i] = (byte)(97 + i % 23);
    }
 
    public MultiplePing(int repeat = 4)
    {
        if (repeat < 1) throw new ArgumentOutOfRangeException("repeat", "repeat must be greater than zero");
 
        _repeat = repeat;
    }
 
    public MultiplePingReply Send(string hostNameOrAddress)
    {
        using (var ping = new Ping())
        {
            int countSuccess = 0, countFailure = 0;
            for (int i = 0; i < _repeat; i++)
            {
                try
                {
                    PingReply reply = ping.Send(hostNameOrAddress, TIMEOUT_MS, defaultPingData);
                    if (reply.Status == IPStatus.Success) countSuccess++;
                    else countFailure++;
                }
                catch (PingException)
                {
                    countFailure++;
                }
                
                Thread.Sleep(PAUSE_MS);
            }
 
            Debug.Assert(countSuccess + countFailure == _repeat);
 
            return new MultiplePingReply(countSuccess, countFailure);
        }
    }
 
    public async Task<MultiplePingReply> SendAsync(string hostNameOrAddress)
    {
        using (var ping = new Ping())
        {
            int countSuccess = 0, countFailure = 0;
            for (int i = 0; i < _repeat; i++)
            {
                try
                {
                    PingReply reply = await ping.SendPingAsync(hostNameOrAddress, TIMEOUT_MS, defaultPingData);
                    if (reply.Status == IPStatus.Success) countSuccess++;
                    else countFailure++;
                }
                catch (PingException)
                {
                    countFailure++;
                }
                
                await Task.Delay(PAUSE_MS);
            }
 
            Debug.Assert(countSuccess + countFailure == _repeat);
 
            return new MultiplePingReply(countSuccess, countFailure);
        }
    }
}
 
class MultiplePingReply
{
    int _countSuccess, _countFailure;
    public MultiplePingReply(int success, int failure)
    {
        if (success < 0) throw new ArgumentOutOfRangeException("success", "success must be positive number or zero");
        if (failure < 0) throw new ArgumentOutOfRangeException("failure", "failure must be positive number or zero");
        if (success == 0 && failure == 0) throw new ArgumentException("success and failure cannot be both zero");
 
        _countSuccess = success;
        _countFailure = failure;
    }
 
    public bool AllSuccess { get { return _countFailure == 0; } }
    public bool AllFailed { get { return _countSuccess == 0; } }
}
3
 Аватар для OpenGoodwin
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
05.01.2015, 04:55  [ТС]
OwenGlendower, хм, спасибо большое за код. Однако, не очень понимаю, как мне в таком коде проверить одновременно 9 серверов? Что бы по нажатию кнопки начался ping всех серверов одновременно.

Добавлено через 7 минут
Всё, разобрался. Спасибо, пометил, как ответ
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.01.2015, 04:55
Помогаю со студенческими работами здесь

Ошибка при проверке доступности текстового адреса (NetworkInformation.Ping)
Написал функцию проверки доступности сервера. Если server_address числовой - работает, если текстовый то нет. В чем ошибка? ...

Есть ping по IP, нет ping по имени
Здравствуйте. Имею AD, DNS, DHCP, терминальная ферма, тонкие клиенты (всё введено в домен) Контроллер домена - ad.mydomen.local...

Отклик
Привет всем! Подскажите, как заставить класс, наследующий интерфейс вызвать метод в другом классе? что-то вроде отклика например,...

Отклик на стрелки
Всем доброго времени суток! У меня было задание сделать в досовской графике следующую штуку: Масштабирование тетраэдра с уменьшением....

Отклик от программы
Когда писал программу (такая проблема на всех моих программах) столкнулся с проблемой отклика, т.е. пока выполняется код, прога виснет до...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru