Неправильный счетчик подключений по локальной сети

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Неправильный счетчик подключений по локальной сети

Сообщение Vova_2581 » 15.03.2016 (Вт) 21:23

Здравствуйте!
У меня такая проблема: написал небольшое Клиент/Серверное приложение (коды прилагаются ниже...). Так вот, возникла проблема со счетчиком подключенных WinSock (то есть Клиентов). Счет выполняется в процедуре ws_ConnectionRequest на Server и записываются в переменную SocketCounter. Когда испытывал все локально на одной машине, то запускал сначала несколько Client, потом Server и в SocketCounter все считалось правильно, ошибок не было. То есть на три копии Client... Server отображал количество - 3... Но в реальной(!) одноранговой сети ситуация получилась другая: SocketCounter выдает каждый раз разные значения! То есть реально физически 23 компьютера, а Server считает в SocketCounter то 45, то 67, 105, 34 и так далее. Не могу понять, что за хрень! Подскажите, пожалуйста, где я ошибся???

Код: Выделить всё
'Server
'ws - WinSock
Dim SocketCounter As Long

Private Sub Form_Load()
Dim n As Long
'Включаем прослушивание портов...
On Error Resume Next
For n = 1 To SocketCounter
     ws(n).Close
     Unload ws(n)
Next
On Error GoTo t
     ws(0).Close
     ws(0).LocalPort = "5555"
     ws(0).Listen
Exit Sub
t:
MsgBox "Error : " & Err.Description, vbCritical
End Sub

Private Sub ws_ConnectionRequest(Index As Integer, ByVal requestID As Long)
SocketCounter = SocketCounter + 1
Load ws(SocketCounter)
ws(SocketCounter).Accept requestID
'Выводим в Label количество подключенных машин...
lbl_Count.Caption = SocketCounter
End Sub

Private Sub cmd_SendData_Click()
'Рассылаем всем клиентам приветствие...
On Error Resume Next
Dim n As Long
For n = 1 To SocketCounter
  ws(n).SendData "Hi"
Next
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim n As Long
For n = 1 To SocketCounter
  ws(n).Close
Next
End
End Sub


Код: Выделить всё
'Client
'ws - WinSock

Private Sub Form_Load()
Timer1.Enabled = True
With ws
  .Close
  .RemoteHost = "192.168.0.1"
  .RemotePort = "5555"
End With
End Sub

Private Sub Timer1_Timer() 'Interval - 500 ms
'Подключаемся...
  If ws.State <> sckConnected Then
   ws.Close
   ws.Connect
  End If
   DoEvents
End Sub

Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim Data As String
ws.GetData Data
MsgBox Data
End Sub

Private Sub Form_Unload(Cancel As Integer)
ws.Close
End Sub

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Неправильный счетчик подключений по локальной сети

Сообщение Jack Ferre » 15.03.2016 (Вт) 21:59

Задача:
Изначально SocketCounter = 0
Запускаем 1 клиент.
Закрываем 1 клиент.

Чему будет равен SocketCounter?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Неправильный счетчик подключений по локальной сети

Сообщение Хакер » 15.03.2016 (Вт) 22:03

Код написан очень плохо, мне больно его читать, поэтому я его не читал особо.

Но разгадка (при условии, что в коде нет ошибок) может быть проста: в сети может быть сколько угодно компьютеров и работающего на нём софта, который пытается подключиться куда-попало. Который перебирает порты и устанавливает случайыне соединения. Это может быть кривой софт, это могут быть сканеры портов, это могут быть зловреды.

Кроме того, я всё-таки не поленился и нашёл вот эту строчку в вырвиглазном коде:
Код: Выделить всё
SocketCounter = SocketCounter + 1


Зато я не вижу строчки, которая уменьшала бы счётчик при разрывах связи и отключениях. Это тоже может быть причиной.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Неправильный счетчик подключений по локальной сети

Сообщение Vova_2581 » 16.03.2016 (Ср) 23:47

Jack Ferre
Я Вас не совсем понял. Выражайтесь конкретней...

Хакер
На этих 23 машинах работает не сколько угодно софта, а всего конкретных(!) 2 - они нужны для работы. Ну и сама Windows конечно... Все остальное, игрушки, например, или левый софт, заблокированны административно! Так что дело не в софте, я так думаю. Хотя я попробую проверить Вашу версию насчет этих 2 софт - может это они "перебирают порты"... Проверю, отпишусь...
Хакер писал(а):Зато я не вижу строчки, которая уменьшала бы счётчик при разрывах связи и отключениях. Это тоже может быть причиной.

Вот это действительно может быть причиной реальной. Clien подключился и Server посчитал, а потом разрыв соединения... но Server не отметил и не уменьшил счетчик. Получается, что все время только и плюсует...
Скажите: а где или как именно отлавливать разрыв соединения?

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Неправильный счетчик подключений по локальной сети

Сообщение Vova_2581 » 16.03.2016 (Ср) 23:52

Самое интересное, что сколько бы не сосчитал Server в SocketCounter абсолютно ВСЕ Client получают свое сообщение... :roll:

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Неправильный счетчик подключений по локальной сети

Сообщение Vova_2581 » 18.03.2016 (Пт) 10:09

Сегодня проверил версию Хакер насчет софта, который якобы делает произвольное подключение куда попало... и от этого сбивается счетчик подключений в моей программе. Так вот, я уже говорил ранее, что со зловредом или левым софтом вариант не проходит, так как все это блокируется административно в самой винде. Остаются только две учебные программки - их я выгрузил из памяти каждого компьютера, осталось только голая Windows XP и мой Client... Запустил Server... и счетчик показал вместо 23 компьютеров в сети 86!!! Так что дело не в софте. Эта версия отпадает!

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

Ну у меня тогда такой вопрос: почему вдруг Client происходит разрыв соединения? В чем причина?? У кого какие версии??

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Неправильный счетчик подключений по локальной сети

Сообщение Хакер » 18.03.2016 (Пт) 10:13

Vova_2581 писал(а):что со зловредом или левым софтом вариант не проходит, так как все это блокируется административно

Какой наивный...

Vova_2581 писал(а):почему вдруг Client происходит разрыв соединения?

Возьми да посмотри. Сниффер в помощь.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Неправильный счетчик подключений по локальной сети

Сообщение Vova_2581 » 18.03.2016 (Пт) 10:17

P.S. Мне вот сотрудники говорят: да кинь ты это все на хрен! Работает так и ладушки, на остальное "забей"... Я бы так и сделал, но получается неудобно: если бы счетчик показывал 23... то есть то, что все машины подключились, тогда можно с ними работать спокойно. А так... приходится каждый раз ждать когда остановится счетчик... а конечное число получается произвольным и неизвестным - каждый раз разные цифры. Так что "забить" совесть не позволяет!

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Неправильный счетчик подключений по локальной сети

Сообщение Vova_2581 » 18.03.2016 (Пт) 10:18

Хакер писал(а):Возьми да посмотри. Сниффер в помощь.

Ок. Попробую...

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Неправильный счетчик подключений по локальной сети

Сообщение Vova_2581 » 18.03.2016 (Пт) 22:58

В общем, для уменьшения переменной SocketCounter в случаях разрыва соединения добавил событие ws_Close... Оно выполняется, когда Client теряет соединение или выгружается...

Код: Выделить всё
Private Sub ws_Close(Index As Integer)
ws(Index).Close
Unload ws(Index)
SocketCounter = SocketCounter – 1
‘Обновляем значение в Label...
lbl_Count.Caption = SocketCounter
End Sub


Этот метод работает, но и тут не обошлось без геморроя. Заключается он в следующем: если открыть, скажем, 5 копий Client. Затем начинать удалять Client по одному (имитирую разрыв соединения), но(!), если открыть, например, 1,2,3,4,5 копий Client. Затем удалить 2,3,4 Client и потом снова запустить парочку новых Client, то Server рушиться ошибкой в строке Load ws(SocketCounter) процедуры ws_ConnectionRequest с сообщением ошибки: «360. Object already loaded». Ну и что я сделал не так??

Изображение
Исходники выкладываю, запустите и попробуйте сами убедиться...
Вложения
Project_Server_Client.rar
Client\Server Application
(10.78 Кб) Скачиваний: 168

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Неправильный счетчик подключений по локальной сети

Сообщение pronto » 19.03.2016 (Сб) 2:30

Происходит фрагментация индексов. Обходится легко. Надо завести массив свободных индексов, который будет пополняться при потере клиента, и уменьшаться при создании новых.
Процедура ws_Close примет вид:
Код: Выделить всё
ws(Index).Close
Unload ws(Index)

ufi = ufi + 1
ReDim Preserve FreeIndex(ufi)
FreeIndex(ufi) = Index

SocketCounter = SocketCounter - 1
'Обновляем значение в Label...
lbl_Count.Caption = SocketCounter

Процедура ws_ConnectionRequest примет вид
Код: Выделить всё
Dim NewIndex As Long

SocketCounter = SocketCounter + 1

If ufi Then
   NewIndex = FreeIndex(ufi)
   ufi = ufi - 1
Else
   NewIndex = SocketCounter
End If
 
Load ws(NewIndex)
ws(NewIndex).Accept requestID
'Выводим в Label количество подключенных машин...
lbl_Count.Caption = SocketCounter

Я не знаю насколько это решение верное, но оно работает...
O, sancta simplicitas!

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Неправильный счетчик подключений по локальной сети

Сообщение Vova_2581 » 19.03.2016 (Сб) 10:53

pronto писал(а):Я не знаю насколько это решение верное, но оно работает...

Я считаю, что правильным решением считается то, которое РАБОТАЕТ(!) в любых условиях и работает БЕЗОТКАЗНО! Именно это и является правильным решением, все остальное, типа, красота и изящность кода является ВТОРИЧНЫМ фактором, а не главным! Это мое убеждение.

pronto
Действительно все работает! Уж как гонял... и в зад, и вперед... - все четко! Ни одного сбоя! СПАСИБО ВАМ!!! :D
Только Вы забыли указать, что нужно в заголовке объявить две глобальные переменные...
Код: Выделить всё
'Для динамического массива...
Dim ufi As Long
Dim FreeIndex() As Long


Выложу финальный вариант, может кому пригодится как метод...

Так, значит, с этим разобрались. Теперь остается проверить версию Хакера насчет левого софта с помощью сниффера. Займусь этим с недели... потом выложу скриншоты.
Вложения
Project_Server_Client_FINAL.rar
Server\Clien Application Final
(11.39 Кб) Скачиваний: 188

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Неправильный счетчик подключений по локальной сети

Сообщение pronto » 19.03.2016 (Сб) 13:27

Vova_2581 писал(а):СПАСИБО ВАМ!!!

Пожалуйста!
Vova_2581 писал(а):Только Вы забыли указать, что нужно в заголовке объявить две глобальные переменные

Не забыл :) Нужные объявления легко понятны из кода
З.Ы. Можно на «ты»
O, sancta simplicitas!

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Неправильный счетчик подключений по локальной сети

Сообщение Vova_2581 » 24.03.2016 (Чт) 13:01

Итак, запустил я сниффер (Как пишут в инете: «один из лучших» IP Sniffer 1.98.1.7) на клиентской машине и на сервере. Все лишнее выгрузил, оставил только систему и Client\Server. Результаты несколько озадачили. :roll:
Приведу скриншоты Server-а, и одну Client (они все одинаковы)...
Вопросы на самих скринах... Посмотрите, пожалуйста, может кто сможет прояснить что к чему?..

Это Server...
Изображение

Это Client...
Изображение

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Неправильный счетчик подключений по локальной сети

Сообщение Vova_2581 » 24.03.2016 (Чт) 13:02

P.S. Забыл добавить, что Server и Client пока еще старые версии...

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Неправильный счетчик подключений по локальной сети

Сообщение Vova_2581 » 25.03.2016 (Пт) 11:25

Ммм...да. Прямо как в песне Пугачевой: "крикну!! а в ответ тишина... снова я осталась одна" ну и т.д... Если специалисты не знают, что это за фигня с сокетом твориться, то я тем более в ступоре! :(

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Неправильный счетчик подключений по локальной сети

Сообщение Jack Ferre » 25.03.2016 (Пт) 14:23

Клиент:

Vova_2581 писал(а):Что за порты?

Исходящие. (Если ты идешь в гости в квартиру 5555, твоя квартира не обязана от этого становиться 5555-й)

Vova_2581 писал(а):Вот это значение каждую секунду увеличивается на 2. Как это объяснить

"2" - потому что
Vova_2581 писал(а):Private Sub Timer1_Timer() 'Interval - 500 ms

"увеличивается" (а точнее - изменяется) - потому что
Vova_2581 писал(а):If ws.State <> sckConnected Then
ws.Close
ws.Connect

Кроме sckConnected есть и другие статусы. (см. Enum StateConstants Member of MSWinsockLib)


Сервер:

Доделай наконец счетчик.
Хакер писал(а):Зато я не вижу строчки, которая уменьшала бы счётчик при разрывах связи и отключениях.

"разрывах связи" - событие Error
"отключениях" - событие Close

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Неправильный счетчик подключений по локальной сети

Сообщение Хакер » 25.03.2016 (Пт) 17:34

Vova_2581 писал(а):Если специалисты не знают

Специалисты знают, просто они ранимые люди. От плохого некачественного и даже не оформленного хоть чуть-чуть кода у них инфаркты случаются.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Неправильный счетчик подключений по локальной сети

Сообщение Vova_2581 » 25.03.2016 (Пт) 23:59

Хакер
Ну, извините за инфаркт... я потому и спрашиваю специалистов, потому как сам любитель, но вот жизнь заставила решить эту задачу на работе, потому и долбаюсь... Решаю, как могу, не обессудьте... :roll:

Jack Ferre
Спасибо за разъяснения, но смотрите, что получается: Вы предложили поменять sckConnected на StateConstants статус. Хорошо... допустим поменял... Тогда скажите, что измениться в итоге, если я поменяю "шило на мыло"?? Ведь если оба этих статуса покажут, что соединения нет, то все равно выполниться код...
ws.Close
ws.Connect

Очевидно это не выход, ведь так?
И скажите еще: какая разница между "разрывом связи" и "отключением связи"?? Как по мне - одно и тоже!

Теперь скажу, что я сделал...
В общем, мне удалось остановить, как Вы сказали "изменения" порта 2 раза в секунду. Что я сделал? Оказалось все просто. Нужно было всего навсего переставить "фишки" местами и добавить один оператор в коде таймера.
Вот с таким кодом... эти "изменения" больше не происходят.
Код: Выделить всё
Private Sub Timer1_Timer() 'Interval - 500 ms
'Подключаемся...
  If ws.State <> sckConnected Then
 
   ws.Close
   ws.LocalPort = "1555" 'Порт можно придумать любой другой не занятый
 
   'ws.Close
   ws.Connect
  End If
   DoEvents
End Sub

Ну вот, в принципе, и все! С недели испытаю все это дело на работе. Надеюсь заработает как надо. :)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, SemrushBot, Yandex-бот и гости: 1

    TopList