Проверка сокетного соединения (C++Builder)
При загрузке клиентской проги на каком-либо компе (серверная постоянно весит на сервере), собственно, и устанавливается это соединение по одному порту. Вопрос: как серверной проге обнаружить, что клиентская прога некорректно вырубилась (например, при падении компа). Она у меня продолжает считать, что соединение по-прежнему присутсвует. Пробовал с серверной проги периодически рассылать пустые сообщения всем клинтам, но при падении одного из клиентов, серверная прога сильно тормозит (видимо, слишком упорно пытается достучаться до клиента). Как можно более рационально проверить, есть соединение или нет?
Цитата:
On 2002-02-14 1306, Niafalcon wrote
Есть две программы серверная и клиентская, соединенные сокетным соединением (TServerSocket, TClientSocket).
При загрузке клиентской проги на каком-либо компе (серверная постоянно весит на сервере), собственно, и устанавливается это соединение по одному порту. Вопрос как серверной проге обнаружить, что клиентская прога некорректно вырубилась (например, при падении компа). Она у меня продолжает считать, что соединение по-прежнему присутсвует. Пробовал с серверной проги периодически рассылать пустые сообщения всем клинтам, но при падении одного из клиентов, серверная прога сильно тормозит (видимо, слишком упорно пытается достучаться до клиента). Как можно более рационально проверить, есть соединение или нет?
В любом случае тебе придётся посылать сигнальные пакеты. Можно, например, рассылать пакеты каждому соединению через определённый интервал. Если 3 или 4 (или любое более удобное число пакетов) осталось без ответа - обрубай канал. Только не рассылай их слишком часто! А вообще, это от специфики проги зависит, мне например хватает одного пакета в 1 минуту и после 5 пакетов - out.
[ Это Сообщение было отредактировано Посторонний в 2002-02-15 0309 ]
удивительно, но несколько дней назад я разбирался именно с этой проблемой. Проблема даже не в том, что сервер пытается долго достучаться до клиента, т.к. у меня была подобная проблема в то время, как все клиенты были запущены и ни один не отключался. Теоретически сервер должен знать, когда произошел обрыв связи и тогда вызывается событие OnClientDisconnect. В документации написано, что это событие вызовется в любом случае, даже если клиент отрубится неккоректно. Но на практике этого не происходит.
Я решил проблему с "зависанием" следующим образом:
Socket->SendText("Test");
Application->ProcesMessages;
В итоге сервер не подвисал, а вот с определением того, жив ли клиент, придется еще повозиться. Еще, кстати, я заметил, что сервер "подвисает" только в том случсае, если отправлять сообения сразу всем клиентам.
Пиши на мыло: будем вместе решать проблему.
Я постпил по другому Ping пакеты у меня отсылают клиенты через каждые 30 сек а сервер проверяет их наличие каждые 50 сек и все ОК ни сервер ни клиенты не тормозят.
Цитата:
On 2002-02-17 0412, Tarasko wrote
У меня тоже была такая проблема.
Я постпил по другому Ping пакеты у меня отсылают клиенты через каждые 30 сек а сервер проверяет их наличие каждые 50 сек и все ОК ни сервер ни клиенты не тормозят.
??????
Почему? Из-за того, что все со всеми какбы в "on-line"?