Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Технические вопросы по PtokaX _ Ваш ник занят и проблемы сети

Автор: RAND(i)M 7.2.2011, 22:17

Может уже есть такая тема, сорри если создал дубль или тема - полный бред.

По техническим причинам, напр. со стороны провайдера иногда рвётся соединение с хабом, и в результате юзер снова подключается к хабу и видит сообщение: "Ваш ник занят...". Причём занят им самим же. После такого события прога-клиент, например GreyLink, перестаёт автоматически подключаться к хабу, пока юзер это не сделает вручную, как гласит статистика, это произойдёт только при следующем запуски клиента юзером.

Так вот, вопрос. Можно ли как-то пресечь такую ситуацию со стороны хаба?


Автор: Nickolya 8.2.2011, 9:55

Нормальные клиенты подключаются к хабу через какой-то интервал, после обрыва, и так постоянно, 1 проблема в клиенте. Выкидывайте вы уже этот грейлинк.
У тебя какая ОС? Если линукс, то возможно тебе помогут настройки, устанавливающие таймаут для отвалившегося сокета. Но более подробно тебе смогут рассказать только линуксойды или мануалы.

Автор: HackFresse 8.2.2011, 9:58

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

Как исправить? На своем компе ты можешь сделать только регистрацию ника на хабе, больше ничего. Вход юзера с паролем обрывает созданное ранее соединение. Очень нехорошо получается, если загружаешь клиентов с нулевым временем ожидания перед подключнием из разных мест (2 грейлинка будут воевать между собой долго и упорно). Хотя в любом случае задержка должна быть, желательно увеличивающаяся после каждой неудачной попытки..

А на сервере..Тут, наверное, если получится придумать скрипт, который при проверке ника нового юзера будет вместо быстрого ValidateDenide при наличии такого же ника делать сначала некую проверку-пинг (запрос IP, что-ли) соединения..

Взял на себя смелость процитировать грамотного специалиста =) :
http://mydc.ru/r/?http://hub.mydc.ru/chatlog.php?perpage=100&i_date=2010-09-17&page=4

Цитата
[2010-09-17 - 17:30:41] <setuper_work> по поводу отключения от хаба
[2010-09-17 - 17:30:47] <setuper_work> раз был такой разговор
[2010-09-17 - 17:31:00] <setuper_work> есть 2 типа отключения
[2010-09-17 - 17:31:06] <setuper_work> корректное и некорректное
...
[2010-09-17 - 17:31:36] <setuper_work> о некорректном отключении хаб узнаёт по ошибкам в сокете
..
[2010-09-17 - 17:32:11] <setuper_work> при корректном отключении клиент отсылает на хаб пустую команду
[2010-09-17 - 17:32:57] <setuper_work> под пустой командой подразумевается не пустая команда протокола NMDC, и даже не пустая строка
[2010-09-17 - 17:33:07] <Alexey> setuper_work: %z?
[2010-09-17 - 17:33:21] <setuper_work> пустая команда - это 0 байт
[2010-09-17 - 17:34:04] <setuper_work> это протокол tcp.шз
[2010-09-17 - 17:34:11] <setuper_work> *tcp/ip
[2010-09-17 - 17:34:53] <setuper_work> поэтому если пингер корректно закрывает сокет, то хаб должен корректно разъединить пигнера
[2010-09-17 - 17:35:22] <setuper_work> в противном случае пингер не уйдёт с хаба


Одна из тем на форуме - http://mydc.ru/topic1868.html


Кстати, на каком-то из крупных хабов (в топ 10 "нашего" хаблиста, сейчас не помню, какой именно) замечал, что ник после обрыва соединения висит больше 4-х часов. А это, по-моему, отличный способ набить счетчик юзеров..

Автор: RAND(i)M 5.4.2011, 7:43

Цитата(HackFesse)
Кстати, на каком-то из крупных хабов (в топ 10 "нашего" хаблиста, сейчас не помню, какой именно) замечал, что ник после обрыва соединения висит больше 4-х часов. А это, по-моему, отличный способ набить счетчик юзеров..
Меня интересуют "живые юзеры" а не накрутка шары и количества
Цитата(HackFesse)
А на сервере..Тут, наверное, если получится придумать скрипт, который при проверке ника нового юзера будет вместо быстрого ValidateDenide при наличии такого же ника делать сначала некую проверку-пинг (запрос IP, что-ли) соединения..
Соответственно, возникает вопрос, есть ли в NMDC безобидная команда, требующая немедленного ответа от клиента (наверно логично, что если ответа не будет, хаб отключит юзера, просто хочется копнуть глубже) ?
Цитата(Nickolya)
У тебя какая ОС? Если линукс, то возможно тебе помогут настройки, устанавливающие таймаут для отвалившегося сокета. Но более подробно тебе смогут рассказать только линуксойды или мануалы.
Windows и пока переход на OpenSource не предвилится... unhappy.gif

Автор: Setuper 5.4.2011, 10:24

Современные клиенты пингуют хабы, отсылая пустую команду (один единственный символ | в сообщении). Пинг происходит примерно раз в 3-4 минуты.

Хаб же отключает пользователя по 2 причинам:

  1. пользователь ушёл с хаба сам (клиент пользователя отослал на хаб сообщение нулевой длины)
  2. пользователь не доступен.



Во втором случае действия зависят от реализации сокет-интерфейса ОС. В винде при попытке отослать данные в "мертвый сокет" возвращается ошибка, по которой хаб и удаляет пользователя.

Однако существует ряд случаев, когда ошибка может не возникать очень долго и хаб будет думать, что клиент ещё "жив".

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


Что касается 4 часов, то это keep alive для сокетов, то есть после определенного времени бездействия система пытается проверить состояние соединения средствами протокола tcp. Система отправляет пинги через некоторый промежуток времени, и если после определенного количества пингов не было получено ни одного ответа от клиента, то клиент считается умершим и сокет закрывается системой.