|
|
|||||
пинг сервером клиентов
Здравствуйте.
Имеется сервак на php и клиенты на flex. По сути - чат. Коннект между клиентами и сервак реализован через сокеты. Все за мечательно, но есть один нюанс: бывает такое, что человек уходит, а сокет не разрывается. Нагуглил, что такое решается пингом. Только не совсем понятно, как именно это реализовать? Вот мои соображения: Сервер раз в 5 секунд, например, отправляет всем клиентам пингующий пакет. Клиент получает его и отправляет ответ. Если ответ от клиента не пришел в течение нескольких секунд, то серв разрывае сокет. Встает ряд вопросов: 1) как отправлять пакет раз в 5 секунд? Ставить какой-то таймер или что? 2) допустим, отправил я пакет, теперь надо засечь время. Если по истечении его ответа нет - разорвать сокет. Как зачечь время? Что-то в этой теории совершенно не верно. Скорее всего, пинговать должны клиенты сервак, но, как сервак узнает, что его перестали пинговать? Есть еще идея, что клинты раз в 5 секунд обновляют время последнего пинга в какой-то переменной своего объекта. Сервак постоянно мониторит эти переменные, как только время с момента последнего пинга превышает заданный интервал - сокет разрывается. Пока что данный метод считаю наиболее правильным. Но может еще еще способы? А может вообще не нужен пинг в данной ситуации? Как тогда можно решить проблему мертвых сокетов? Спасибо. |
|
|||||
Erlyvideo
|
Тебе достаточно слать раз в 5 секунд пинг. Сам TCP может жить почти 3 часа.
Наверное, имеет смысл сделать так: пусть клиент шлет пинг, сервер понг. Если сервер понг не прислал, клиент знает, что он временно офлайн. Сервер знает, что клиент офлайн. Когда (если) TCP обратно появится, все эти пинг-понги пройдут. |
|
|||||
Прикол в том, что сокет обычно становиться мертвым, если клиент резко ушел (повис браузер, вырубился комп или другие такие напастья). Поэтому сервак должен такие штуки как-то отслеживать...
|
|
|||||
[+1 19.06.10]
[+1 27.07.10] Регистрация: Aug 2009
Адрес: UTC+2
Сообщений: 353
|
вообще встроенные средства netconnection умеют слать пинги и ждать от ФП клиента понги.
мне показалось, что когда пользователь закрывает браузер или переходит на другую страницу, то ФП корректно закрывает сокет netconnection. А вот метод close закрывает его некорректно (имхо) если вы реализовали связь с клиентами не через netconnection, а через сокет, то по идее закрытие сокета на клиенте вызовет отправку FIN серверу. или же при попытке чото послать клиенту в закрытый сокет серверный сокет вернет ошибку типа POLL_ERR или POLL_HUP зависшего юзера быстрее всего ловить пингами только зачем каждые 5 сек слать ?
__________________
Trapatatupatupa |
|
|||||
На счет 5 секунд я грубо сказал, для примера.
Сокеты обычно отрабатывают нормально, все как Вы говорите - при закрытии браузера или переходе на другую страницу сокет рветься. Но в малом проценте случаев (может 1% из 100) сокет остается. А вот на счет того, что если послать в закрытый сокет пакет и он вернет ошибку - это интересно, спасибо, я вспомнил, что была такая ситуация =) Единственно, меня смущает, как через некоторое время (несколько секунд или минут) посылать пинги с сервера? как поставить счетчик? На прием сообщений от сокета у меня стоит цикл while (true), но он повторяется моментально, что-то я туплю =) |
|
|||||
Banned
Регистрация: Aug 2010
Сообщений: 57
|
Есть такая байда ... особенно если клиент под Linux. Тогда вообще с сокетами чудеса происходят которые понять невозможно.
|
|
|||||
Цитата:
Добавлено через 11 минут до меня дошло как это сделать =) всем спасибо |
|
|||||
Регистрация: Feb 2008
Сообщений: 890
|
Хорошим тоном считается закрывать топик не этими словами, а описанием решения обозначенной в топике проблемы.
__________________
скриптограф |
Часовой пояс GMT +4, время: 05:19. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|