Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/27: Рейтинг темы: голосов - 27, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 21

Ping систем в сети и оповещение о их состоянии

03.09.2012, 20:05. Показов 5317. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех форумчан!
Нуждаюсь в совете - разрабатываю программу по мониторингу состояния компьютера в сети, через пинг по таймеру; возник вопрос - каким образом лучше всего оповестить пользователя о недоступном компьютере (если программа будет минимизирована трей). MessageBox не подходит на тот случай, если будет производиться частый опрос (то есть пинг осуществляется по событию Timer1_Tick, а оповещение необходимо вынести за рамки этого события)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.09.2012, 20:05
Ответы с готовыми решениями:

Винда предупреждает о плохом состоянии HDD. Как отключить оповещение?
Windows 7 на ноутбуке выдает периодически окно по центру экрана, что состояние HDD плохое. Закрывать окно изрядно поднадоело. ...

Оповещение пользователей сети
Добрый день. Прошу помочь. Мало знаком с Win Server. Одноранговая сеть, Server 2003 (используется как файловый и DHCP). Есть...

Оповещение пользователей в сети при изменениях в БД
Доброго времени суток Всем! Подскажите пожалуйста как можно организовать чудо чудное нужно что бы при работе с базой один человек...

10
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
03.09.2012, 20:20
ratata, Я бы сделал своеобразное "табло" с "лампочками"
Комп в сетке - лампочка горит, если юзер на том компе завершает процесс csrss.exe, то лампочка тухнет (образно)
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.09.2012, 21:07
...для своих внутренних нужд делал пингатор с таким интерфейсом:

(в трее иконка с тремя окошками-прямоугольниками друг за другом, каждое отвечает за прохождение пинга на роутер, внешний шлюз и удаленную машину - загорается зеленым соответствующий + подсказка при подводе мышки)

p.s.: в вашем случае, зависит от кол-ва машин, ибо размер одиночной иконки в трее ограничен 16 пкс, либо несколько иконок для одного приложения, по типу:
Название: picture4.1.png
Просмотров: 603

Размер: 16.2 Кб
0
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 21
04.09.2012, 13:38  [ТС]
За идеи с иконками спасибо! учту, если будет время поджимать)

а возможны варианты реализации через модальное окно? не силен в ООП и vb .net, но что-то мне подсказывает, что такой вариант возможен через создание собственных классов, к которым будет привязана обработка исключения ping.

Добавлено через 15 часов 1 минуту
Еще вот такая загвоздка:
результат пинга записывается в лог-файл, успешное событие проходит незаметно для программы, а при проверке недоступного хоста обработчик исключения PingException подвешивает программу на 2 секунды. Результат - пинг всего списка компьютеров непростительно затягивается. Возможно ускорить обработку этого события?
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Try
                ping.Send(host(i), timeOut)
                strLog = "Пинг с " & host(i) & " успешно пройден " _
                                        & Now.ToLongDateString & " в " & Now.ToLongTimeString & vbNewLine
 
                Call writeLog(logPath, strLog)
 
            Catch ex3 As System.Net.NetworkInformation.PingException
                strLog = "Error! Пинг " & host(i) & " провести не удалось. " _
                            & Now.ToLongDateString & " " & Now.ToLongTimeString & vbNewLine
 
                Call writeLog(logPath, strLog)
                
            End Try
0
290 / 271 / 107
Регистрация: 10.06.2011
Сообщений: 696
04.09.2012, 15:09
Запускай обработку ошибок или весь пинг асинхронным потоком:
VB.NET
1
Me.BegIninvoke(New MethodInvoker(AddressOff процедура))
0
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 21
05.09.2012, 10:57  [ТС]
Цитата Сообщение от Pipyak Посмотреть сообщение
VB.NET
1
Me.BegIninvoke(New MethodInvoker(AddressOff процедура))
Судя по тому, что нашел - процедура должна быть без аргументов, а мне в любом случае из двух необходимо передавать через аргументы либо IP-адрес, либо адрес файла и строку с сообщением. Или я что-то не так понял?
0
290 / 271 / 107
Регистрация: 10.06.2011
Сообщений: 696
05.09.2012, 15:45
Сделай 2 глобальные переменные и передавай параметры через них
0
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 21
05.09.2012, 17:06  [ТС]
Точно, спасибо.

Пока посыпались индексы массивов - доработаю, наверное, в пятницу.
0
 Аватар для abbat81
33 / 33 / 3
Регистрация: 20.07.2011
Сообщений: 407
05.09.2012, 20:04
Самому интересна эта архитектура массового пинга.
Было 34 машины - пинговались.
Пинг каждого - в новом отдельном потоке.
Сжирало 80 % проца. ну его этот пинг.
Пришлось вернуться к старому варианту.
С арифметической обработкой сравнения последнего времени клиента с временем сервера на Мускуле. Если больше 2 сек разрыв - считается, что "пинг" пропал.
0
 Аватар для XIST
1960 / 1070 / 148
Регистрация: 01.10.2009
Сообщений: 3,597
Записей в блоге: 1
06.09.2012, 08:11
Пример асинхронного пинга на C#, переделывал на vb не получилось, мож что пригодится...

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net.NetworkInformation;
 
 
namespace Ping
 
{
  public partial class Form1 : Form
  {
 
    // Counts the pings
 
    private int pingsSent;
 
    // Can be used to notify when the operation completes
 
    AutoResetEvent resetEvent = new AutoResetEvent(false);
 
 
 
    public Form1()
 
    {
 
      InitializeComponent();
 
    }
 
 
 
    private void btnPing_Click(object sender, EventArgs e)
 
    {
 
      // Reset the number of pings
 
      pingsSent = 0;
 
      // Clear the textbox of any previous content
 
      txtResponse.Clear();
 
      txtResponse.Text += "Pinging " + txtIP.Text + " with 32 bytes of data:\r\n\r\n";
 
      // Send the ping
 
      SendPing();
 
    }
 
 
 
    private void SendPing()
 
    {
 
      System.Net.NetworkInformation.Ping pingSender = new System.Net.NetworkInformation.Ping();
 
 
 
      // Create an event handler for ping complete
 
      pingSender.PingCompleted += new PingCompletedEventHandler(pingSender_Complete);
 
 
 
      // Create a buffer of 32 bytes of data to be transmitted.
 
      byte[] packetData = Encoding.ASCII.GetBytes("................................");
 
 
 
      // Jump though 50 routing nodes tops, and don't fragment the packet
 
      PingOptions packetOptions = new PingOptions(50, true);
 
 
 
      // Send the ping asynchronously
 
      pingSender.SendAsync(txtIP.Text, 5000, packetData, packetOptions, resetEvent);
 
    }
 
    private void pingSender_Complete(object sender, PingCompletedEventArgs e)
 
    {
 
      // If the operation was canceled, display a message to the user.
 
      if (e.Cancelled)
 
      {
 
        txtResponse.Text += "Ping was canceled...\r\n";
 
 
        // The main thread can resume
 
        ((AutoResetEvent)e.UserState).Set();
 
      }
 
      else if (e.Error != null)
 
      {
 
        txtResponse.Text += "An error occured: " + e.Error + "\r\n";
 
 
 
        // The main thread can resume
 
        ((AutoResetEvent)e.UserState).Set();
 
      }
 
      else
 
      {
 
        PingReply pingResponse = e.Reply;
 
        // Call the method that displays the ping results, and pass the information with it
 
        ShowPingResults(pingResponse);
 
      }
 
    }
 
 
 
    public void ShowPingResults(PingReply pingResponse)
 
    {
 
      if (pingResponse == null)
 
      {
 
        // We got no response
 
        txtResponse.Text += "There was no response.\r\n\r\n";
 
        return;
 
      }
 
      else if (pingResponse.Status == IPStatus.Success)
 
      {
 
        // We got a response, let's see the statistics
 
        txtResponse.Text += "Reply from " + pingResponse.Address.ToString() + ": bytes=" + pingResponse.Buffer.Length + " time=" + pingResponse.RoundtripTime + " TTL=" + pingResponse.Options.Ttl + "\r\n";
 
      }
 
      else
 
      {
 
        // The packet didn't get back as expected, explain why
 
        txtResponse.Text += "Ping was unsuccessful: " + pingResponse.Status + "\r\n\r\n";
 
      }
 
      // Increase the counter so that we can keep track of the pings sent
 
      pingsSent++;
 
      // Send 4 pings
 
      if (pingsSent < 4)
 
      {
 
        SendPing();
 
      }
 
    }
 
  }
 
}
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||VB
 
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Imports System.Threading
Imports System.Net.NetworkInformation
 
 
Namespace Ping
 
    Public Partial Class Form1
        Inherits Form
 
        ' Counts the pings
 
        Private pingsSent As Integer
 
        ' Can be used to notify when the operation completes
 
        Private resetEvent As New AutoResetEvent(False)
 
 
 
        Public Sub New()
 
 
 
            InitializeComponent()
        End Sub
 
 
 
        Private Sub btnPing_Click(sender As Object, e As EventArgs)
 
 
            ' Reset the number of pings
 
            pingsSent = 0
 
            ' Clear the textbox of any previous content
 
            txtResponse.Clear()
 
            txtResponse.Text += "Pinging " + txtIP.Text + " with 32 bytes of data:" & vbCr & vbLf & vbCr & vbLf
 
            ' Send the ping
 
            SendPing()
 
        End Sub
 
 
 
        Private Sub SendPing()
 
 
            Dim pingSender As New System.Net.NetworkInformation.Ping()
 
 
 
            ' Create an event handler for ping complete
 
            pingSender.PingCompleted += New PingCompletedEventHandler(pingSender_Complete)
 
 
 
            ' Create a buffer of 32 bytes of data to be transmitted.
 
            Dim packetData As Byte() = Encoding.ASCII.GetBytes("................................")
 
 
 
            ' Jump though 50 routing nodes tops, and don't fragment the packet
 
            Dim packetOptions As New PingOptions(50, True)
 
 
 
            ' Send the ping asynchronously
 
            pingSender.SendAsync(txtIP.Text, 5000, packetData, packetOptions, resetEvent)
 
        End Sub
 
        Private Sub pingSender_Complete(sender As Object, e As PingCompletedEventArgs)
 
 
            ' If the operation was canceled, display a message to the user.
 
            If e.Cancelled Then
 
 
                txtResponse.Text += "Ping was canceled..." & vbCr & vbLf
 
 
                ' The main thread can resume
 
 
                (DirectCast(e.UserState, AutoResetEvent)).[Set]()
 
            ElseIf e.[Error] <> Nothing Then
 
 
                txtResponse.Text += "An error occured: " + e.[Error] + vbCr & vbLf
 
 
 
                ' The main thread can resume
 
 
                (DirectCast(e.UserState, AutoResetEvent)).[Set]()
            Else
 
 
 
                Dim pingResponse As PingReply = e.Reply
 
                ' Call the method that displays the ping results, and pass the information with it
 
 
                ShowPingResults(pingResponse)
            End If
 
        End Sub
 
 
 
        Public Sub ShowPingResults(pingResponse As PingReply)
 
 
            If pingResponse = Nothing Then
 
 
                ' We got no response
 
                txtResponse.Text += "There was no response." & vbCr & vbLf & vbCr & vbLf
 
 
                Return
 
            ElseIf pingResponse.Status = IPStatus.Success Then
 
 
                ' We got a response, let's see the statistics
 
 
                txtResponse.Text += "Reply from " + pingResponse.Address.ToString() + ": bytes=" + pingResponse.Buffer.Length + " time=" + pingResponse.RoundtripTime + " TTL=" + pingResponse.Options.Ttl + vbCr & vbLf
            Else
 
 
 
                ' The packet didn't get back as expected, explain why
 
 
                txtResponse.Text += "Ping was unsuccessful: " + pingResponse.Status + vbCr & vbLf & vbCr & vbLf
            End If
 
            ' Increase the counter so that we can keep track of the pings sent
 
            System.Math.Max(System.Threading.Interlocked.Increment(pingsSent),pingsSent - 1)
 
            ' Send 4 pings
 
            If pingsSent < 4 Then
 
 
 
                SendPing()
            End If
 
        End Sub
 
    End Class
 
End Namespace
0
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 21
07.09.2012, 12:05  [ТС]
Цитата Сообщение от Pipyak Посмотреть сообщение
Сделай 2 глобальные переменные и передавай параметры через них
При вызове
VB.NET
1
Me.BeginInvoke(New MethodInvoker(AddressOf globalPing))
пинг не проходит, без обработки ошибок при первой же попытке (которая должна пройти успешно) выводит: "Object reference not set to an instance of an object.",
с обработкой после обхода всего списка возникает ошибка : "Index was outside the bounds of the array."

При простом вызове globalPing() все отрабатывает как и должно быть, никаких превышенных индексов, только то же самое зависание при обработке ошибок.

код:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
For i = 0 To host.Length - 1
            'пинг
            Try
                Me.BeginInvoke(New MethodInvoker(AddressOf globalPing))
                'globalPing()
                strLog = reply.Status.ToString & " хост: " & host(i) & " Время: " _
                                        & " " & Now.ToLongDateString & " " & Now.ToLongTimeString & vbNewLine
                'запись о событии в лог
                Call writeLog(logPath, strLog)
 
            Catch ex3 As Exception 'System.Net.NetworkInformation.PingException
                strLog = "Ошибка! " & host(i) & " недоступен. " _
                            & Now.ToLongDateString & " " & Now.ToLongTimeString & vbNewLine
                'запись о событии в лог
                Call writeLog(logPath, strLog)
 
            End Try
        Next
 
    Private Sub globalPing()
        reply = ping.Send(host(i), timeOut)
    End Sub
Цитата Сообщение от abbat81 Посмотреть сообщение
Самому интересна эта архитектура массового пинга.
Было 34 машины - пинговались.
Пинг каждого - в новом отдельном потоке.
Сжирало 80 % проца. ну его этот пинг.
у меня максимум 9%..

Цитата Сообщение от DM_AND Посмотреть сообщение
Пример асинхронного пинга на C#, переделывал на vb не получилось, мож что пригодится... [/CSHARP]
а имеет смысл проводить пинг в асинхронном потоке?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.09.2012, 12:05
Помогаю со студенческими работами здесь

Графическое отображение собранных данных о состоянии сети
Добрый день! есть скрипт на ps который опрашивает коммутаторы в сети и в случае критических значений выводит состояние через...

Резервный вариант поддержания сети в рабочем состоянии
Имеется предприятие из 3 этажей (виртуальное). Для каждого этажа было выделено по 1 роутеру, где для каждого этажа были прописаны свои...

Ping в сети. Timeout
День добрый! Делаю для себя программку, которая по таймеру сканирует компьютеры в домене и вносит в базу информацию о ПК, времени и...

Ping во внутренней сети
Есть 2 компьютера и wi-fi роутер. На 1 компьютере 7 винда, на другом убунта. IP адреса из внутренней сети(роутер раздал им), но пинг между...

Подключение к сети есть, а в состоянии подключения ipv4 не подключено
подключение к сети есть а в состоянии подключения ipv4 не подключено и ipv6 не подключено. ping 8.8.8.8 выдает сбой передачи. общий сбой ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru