Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.09.2010, 17:44
altermann вне форума Посмотреть профиль Отправить личное сообщение для altermann Найти все сообщения от altermann
  № 1  
Ответить с цитированием
altermann
 
Аватар для altermann

Регистрация: Jul 2010
Адрес: 59.939039, 30.315785
Сообщений: 65
Отправить сообщение для altermann с помощью ICQ Отправить сообщение для altermann с помощью Skype™
По умолчанию пинг сервером клиентов

Здравствуйте.

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

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

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

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

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

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

Спасибо.

Старый 23.09.2010, 17:50
maxlapshin вне форума Посмотреть профиль Отправить личное сообщение для maxlapshin Найти все сообщения от maxlapshin
  № 2  
Ответить с цитированием
maxlapshin
Erlyvideo

Регистрация: Aug 2008
Сообщений: 197
Отправить сообщение для maxlapshin с помощью ICQ
Тебе достаточно слать раз в 5 секунд пинг. Сам TCP может жить почти 3 часа.

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

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

Старый 23.09.2010, 17:58
altermann вне форума Посмотреть профиль Отправить личное сообщение для altermann Найти все сообщения от altermann
  № 3  
Ответить с цитированием
altermann
 
Аватар для altermann

Регистрация: Jul 2010
Адрес: 59.939039, 30.315785
Сообщений: 65
Отправить сообщение для altermann с помощью ICQ Отправить сообщение для altermann с помощью Skype™
Прикол в том, что сокет обычно становиться мертвым, если клиент резко ушел (повис браузер, вырубился комп или другие такие напастья). Поэтому сервак должен такие штуки как-то отслеживать...

Старый 23.09.2010, 18:16
Crenth вне форума Посмотреть профиль Отправить личное сообщение для Crenth Найти все сообщения от Crenth
  № 4  
Ответить с цитированием
Crenth
[+1 19.06.10]
[+1 27.07.10]
 
Аватар для Crenth

Регистрация: Aug 2009
Адрес: UTC+2
Сообщений: 353
вообще встроенные средства netconnection умеют слать пинги и ждать от ФП клиента понги.
мне показалось, что когда пользователь закрывает браузер или переходит на другую страницу, то ФП корректно закрывает сокет netconnection. А вот метод close закрывает его некорректно (имхо)
если вы реализовали связь с клиентами не через netconnection, а через сокет, то по идее закрытие сокета на клиенте вызовет отправку FIN серверу.
или же при попытке чото послать клиенту в закрытый сокет серверный сокет вернет ошибку типа POLL_ERR или POLL_HUP
зависшего юзера быстрее всего ловить пингами
только зачем каждые 5 сек слать ?
__________________
Trapatatupatupa

Старый 23.09.2010, 18:41
altermann вне форума Посмотреть профиль Отправить личное сообщение для altermann Найти все сообщения от altermann
  № 5  
Ответить с цитированием
altermann
 
Аватар для altermann

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

Старый 23.09.2010, 18:44
FMS вне форума Посмотреть профиль Найти все сообщения от FMS
  № 6  
Ответить с цитированием
FMS
Banned

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

Старый 23.09.2010, 18:47
altermann вне форума Посмотреть профиль Отправить личное сообщение для altermann Найти все сообщения от altermann
  № 7  
Ответить с цитированием
altermann
 
Аватар для altermann

Регистрация: Jul 2010
Адрес: 59.939039, 30.315785
Сообщений: 65
Отправить сообщение для altermann с помощью ICQ Отправить сообщение для altermann с помощью Skype™
Цитата:
Сообщение от FMS Посмотреть сообщение
Есть такая байда ... особенно если клиент под Linux. Тогда вообще с сокетами чудеса происходят которые понять невозможно.
вот, вот, я как раз прогаю в никсе, тут то я и заметил такие чудеса =))

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

Старый 28.09.2010, 16:30
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 8  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Код:
до меня дошло как это сделать =) всем спасибо
Хорошим тоном считается закрывать топик не этими словами, а описанием решения обозначенной в топике проблемы.
__________________
скриптограф

Создать новую тему Ответ Часовой пояс GMT +4, время: 05:19.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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