Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проверка сокетного соединения (C++Builder)

560
14 февраля 2002 года
Niafalcon
6 / / 20.01.2000
Есть две программы: серверная и клиентская, соединенные сокетным соединением (TServerSocket, TClientSocket).
При загрузке клиентской проги на каком-либо компе (серверная постоянно весит на сервере), собственно, и устанавливается это соединение по одному порту. Вопрос: как серверной проге обнаружить, что клиентская прога некорректно вырубилась (например, при падении компа). Она у меня продолжает считать, что соединение по-прежнему присутсвует. Пробовал с серверной проги периодически рассылать пустые сообщения всем клинтам, но при падении одного из клиентов, серверная прога сильно тормозит (видимо, слишком упорно пытается достучаться до клиента). Как можно более рационально проверить, есть соединение или нет?
545
15 февраля 2002 года
Посторонний
74 / / 20.05.2000
Цитата:

On 2002-02-14 1306, Niafalcon wrote
Есть две программы серверная и клиентская, соединенные сокетным соединением (TServerSocket, TClientSocket).
При загрузке клиентской проги на каком-либо компе (серверная постоянно весит на сервере), собственно, и устанавливается это соединение по одному порту. Вопрос как серверной проге обнаружить, что клиентская прога некорректно вырубилась (например, при падении компа). Она у меня продолжает считать, что соединение по-прежнему присутсвует. Пробовал с серверной проги периодически рассылать пустые сообщения всем клинтам, но при падении одного из клиентов, серверная прога сильно тормозит (видимо, слишком упорно пытается достучаться до клиента). Как можно более рационально проверить, есть соединение или нет?


В любом случае тебе придётся посылать сигнальные пакеты. Можно, например, рассылать пакеты каждому соединению через определённый интервал. Если 3 или 4 (или любое более удобное число пакетов) осталось без ответа - обрубай канал. Только не рассылай их слишком часто! А вообще, это от специфики проги зависит, мне например хватает одного пакета в 1 минуту и после 5 пакетов - out.

[ Это Сообщение было отредактировано Посторонний в 2002-02-15 0309 ]

978
15 февраля 2002 года
lso
9 / / 20.07.2000
Привет,
удивительно, но несколько дней назад я разбирался именно с этой проблемой. Проблема даже не в том, что сервер пытается долго достучаться до клиента, т.к. у меня была подобная проблема в то время, как все клиенты были запущены и ни один не отключался. Теоретически сервер должен знать, когда произошел обрыв связи и тогда вызывается событие OnClientDisconnect. В документации написано, что это событие вызовется в любом случае, даже если клиент отрубится неккоректно. Но на практике этого не происходит.
Я решил проблему с "зависанием" следующим образом:
Socket->SendText("Test");
Application->ProcesMessages;
В итоге сервер не подвисал, а вот с определением того, жив ли клиент, придется еще повозиться. Еще, кстати, я заметил, что сервер "подвисает" только в том случсае, если отправлять сообения сразу всем клиентам.

Пиши на мыло: будем вместе решать проблему.
1.4K
17 февраля 2002 года
Tarasko
5 / / 20.07.2000
У меня тоже была такая проблема.
Я постпил по другому Ping пакеты у меня отсылают клиенты через каждые 30 сек а сервер проверяет их наличие каждые 50 сек и все ОК ни сервер ни клиенты не тормозят.
Аноним
Цитата:

On 2002-02-17 0412, Tarasko wrote
У меня тоже была такая проблема.
Я постпил по другому Ping пакеты у меня отсылают клиенты через каждые 30 сек а сервер проверяет их наличие каждые 50 сек и все ОК ни сервер ни клиенты не тормозят.



??????

Почему? Из-за того, что все со всеми какбы в "on-line"?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог