Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   пинг сервером клиентов (http://www.flasher.ru/forum/showthread.php?t=144894)

altermann 23.09.2010 17:44

пинг сервером клиентов
 
Здравствуйте.

Имеется сервак на php и клиенты на flex. По сути - чат. Коннект между клиентами и сервак реализован через сокеты. Все за мечательно, но есть один нюанс: бывает такое, что человек уходит, а сокет не разрывается. Нагуглил, что такое решается пингом. Только не совсем понятно, как именно это реализовать?

Вот мои соображения:

Сервер раз в 5 секунд, например, отправляет всем клиентам пингующий пакет. Клиент получает его и отправляет ответ. Если ответ от клиента не пришел в течение нескольких секунд, то серв разрывае сокет. Встает ряд вопросов:
1) как отправлять пакет раз в 5 секунд? Ставить какой-то таймер или что?
2) допустим, отправил я пакет, теперь надо засечь время. Если по истечении его ответа нет - разорвать сокет. Как зачечь время?

Что-то в этой теории совершенно не верно. Скорее всего, пинговать должны клиенты сервак, но, как сервак узнает, что его перестали пинговать?

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

А может вообще не нужен пинг в данной ситуации? Как тогда можно решить проблему мертвых сокетов?

Спасибо.

maxlapshin 23.09.2010 17:50

Тебе достаточно слать раз в 5 секунд пинг. Сам TCP может жить почти 3 часа.

Наверное, имеет смысл сделать так: пусть клиент шлет пинг, сервер понг. Если сервер понг не прислал, клиент знает, что он временно офлайн. Сервер знает, что клиент офлайн.

Когда (если) TCP обратно появится, все эти пинг-понги пройдут.

altermann 23.09.2010 17:58

Прикол в том, что сокет обычно становиться мертвым, если клиент резко ушел (повис браузер, вырубился комп или другие такие напастья). Поэтому сервак должен такие штуки как-то отслеживать...

Crenth 23.09.2010 18:16

вообще встроенные средства netconnection умеют слать пинги и ждать от ФП клиента понги.
мне показалось, что когда пользователь закрывает браузер или переходит на другую страницу, то ФП корректно закрывает сокет netconnection. А вот метод close закрывает его некорректно (имхо)
если вы реализовали связь с клиентами не через netconnection, а через сокет, то по идее закрытие сокета на клиенте вызовет отправку FIN серверу.
или же при попытке чото послать клиенту в закрытый сокет серверный сокет вернет ошибку типа POLL_ERR или POLL_HUP
зависшего юзера быстрее всего ловить пингами
только зачем каждые 5 сек слать ?

altermann 23.09.2010 18:41

На счет 5 секунд я грубо сказал, для примера.
Сокеты обычно отрабатывают нормально, все как Вы говорите - при закрытии браузера или переходе на другую страницу сокет рветься. Но в малом проценте случаев (может 1% из 100) сокет остается.
А вот на счет того, что если послать в закрытый сокет пакет и он вернет ошибку - это интересно, спасибо, я вспомнил, что была такая ситуация =)
Единственно, меня смущает, как через некоторое время (несколько секунд или минут) посылать пинги с сервера? как поставить счетчик?
На прием сообщений от сокета у меня стоит цикл while (true), но он повторяется моментально, что-то я туплю =)

FMS 23.09.2010 18:44

Есть такая байда ... особенно если клиент под Linux. Тогда вообще с сокетами чудеса происходят которые понять невозможно.

altermann 23.09.2010 18:47

Цитата:

Сообщение от FMS (Сообщение 938186)
Есть такая байда ... особенно если клиент под Linux. Тогда вообще с сокетами чудеса происходят которые понять невозможно.

вот, вот, я как раз прогаю в никсе, тут то я и заметил такие чудеса =))

Добавлено через 11 минут
до меня дошло как это сделать =) всем спасибо

orcpochta 28.09.2010 16:30

Код:

до меня дошло как это сделать =) всем спасибо
Хорошим тоном считается закрывать топик не этими словами, а описанием решения обозначенной в топике проблемы.


Часовой пояс GMT +4, время: 02:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.