Как определить, произошел ли сбой (или выход) клиента для сервера, использующего Qt - PullRequest
2 голосов
/ 30 марта 2011

Клиент использует ssh login и запускает сервер на удаленной машине, затем клиника создает tcp-соединение с сервером.Серверу нужно выходить, когда у клиента выход нормальный, или произошел сбой, или отключена сеть.Поэтому вопрос заключается в том, как определить, произошел ли сбой клиента, к которому подключен сервер.

Первая попытка - использовать сигнал error (), перехватить QAbsoluteSocket :: NetworkError, чтобы определить, что сеть была сброшена.Но я вообще не могу получить сигнал об ошибке (), даже если я вытащил сетевой кабель.

Вторая попытка - использование SocketState, я думаю, что когда SocketState имеет значение UnconnectedState, клиент может выйти нормально, асервер тоже должен выйти.Этот способ отлично работает для «нормального выхода», но я не знаю, как бороться с «крахом» и «мертвой сетью».

Помогите, спасибо!

Ответы [ 2 ]

3 голосов
/ 30 марта 2011

Я бы рекомендовал использовать TCP для поддержки . Он не доступен через общедоступный интерфейс QTcpSocket , но вы можете использовать setsockopt с QAbstractSocker :: socketDescriptor для активации функции SO_KEEPALIVE .

РЕДАКТИРОВАТЬ: Похоже, что в какой-то момент в QAbstractSocket была добавлена ​​поддержка активности. Итак, просто вызовите QAbstractSocket :: setSocketOption с QAbstractSocket :: KeepAliveOption .

Информацию о настройке времени ожидания запроса на поддержку можно найти здесь: http://www.gnugk.org/keepalive.html

1 голос
/ 30 марта 2011

В большинстве случаев единственный способ узнать, что существует проблема с соединением через сокет, - это когда вы пытаетесь читать или писать с ним.Есть некоторые исключения: Windows изменит состояние сокетов, если сетевой кабель отключен, Linux (по моему опыту) не будет.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...