Время жизни QTcpSocket - PullRequest
3 голосов
/ 28 июля 2011

В настоящее время я разрабатываю приложение для Android, которое подключается к серверу через TCP.Сервер написан на Qt и работает на компьютере.

На стороне сервера я использую QTcpServer и сигнал QTcpServer::newConnection(), чтобы получить QTcpSocket, вновь подключенный к QTcpServer::nextPendingConnection().Я реализовал класс под названием SocketManager, который управляет данными, полученными этим сокетом.

На стороне Android я использую java Socket для подключения к серверу.

Все отлично работает.Когда сторона Android отключается от сервера, мой SocketManager объект хорошо уведомляется и разрушается.Но я бы хотел правильно управлять случаем, когда, например, устройство Android переходит в автономный режим или выключается.В этом случае я не уведомлен об отключении Android.Я подключаю эти сигналы моего QTcpSocket:

  • QAbstractSocket::disconnected(),
  • QAbstractSocket::stateChanged(QAbstractSocket::SocketState)
  • QAbstractSocket::error(QAbstractSocket::SocketError)
  • QObject::destroyed(QObject*)думая, что, возможно, QTcpSocket внутренне уничтожен QTcpServer.

Но сигнал не поступает, когда устройство Android отключается или выключается.

Когда QTcpSocket будет выпущен QTcpServer?Только когда розетка явно отключена?Так что в моем случае, он никогда не будет уничтожен?Должен ли я управлять отключением во всех случаях на стороне Android?

Спасибо всем.

1 Ответ

4 голосов
/ 28 июля 2011

TCP не будет уведомлять вас об отключениях, если только удаленный узел явно не отправит запрос на отключение (используя close () или shutdown () методы) или выпопытайтесь выполнить запись в отключенный сокет (в этом случае вы получите сигнал сломанная труба )

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

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