Проверка соединения через сокет Qt TCP/IP
Я пишу клиент Qt TCP/IP. Я хочу проверить состояние соединения с сервером, прежде чем отправлять данные на сервер. Насколько мне известно, я могу сделать это, используя следующие методы
- Используйте bool 'ConnectionState', установите эту переменную при соединении с сервером и сбросьте эту переменную по сигналу disconnected(). Теперь перед отправкой данных на сервер (client->write()) проверьте значение этой переменной.
- используйте этотметод client->state() == QTcpSocket::ConnectedState для проверки состояния соединения.
Что является хорошей практикой. Или любой другой метод к этому.
Заранее спасибо.
2 ответа
QTCPSocket
происходит от QAbstractSocket
, который обеспечивает state()
функция. Это возвращает одно из следующих перечислений: -
enum SocketState { UnconnectedState, HostLookupState, ConnectingState, ConnectedState, ..., ListeningState }
Итак, предполагая, что m_pSocket является QTcpSocket
, вы бы просто сделали это, чтобы проверить, подключен ли он: -
bool connected = (m_pSocket->state() == QTcpSocket::ConnectedState);
Вы можете добавить логическое значение и отслеживать состояние, но если возникает ошибка сети, вам необходимо убедиться, что она всегда синхронизирована с фактическим состоянием соединения.
Вы можете использовать
errorOccurred
signal и достаточно для этого сигнала определить слот в клиенте. при возникновении ошибки срабатывает сигнал, и вы можете получить уведомление в функции слота.
В клиенте.ч
/* define a slot for client */
public slots:
void errorOccurred(QAbstractSocket::SocketError error);
В клиенте.с
/*client constructor*/
Client::Client(QObject *parent) {
/*some other code here*/
connect(socket, SIGNAL(errorOccurred(QAbstractSocket::SocketError)),
this, SLOT(errorOccurred(QAbstractSocket::SocketError)));
/*and maybe some other code here*/
}
и в client.c напишите реализацию для errorOccurred:
void Client::errorOccurred(QAbstractSocket::SocketError error) {
qDebug() << "error in connection: " << socket->errorString();
}
ВЫХОД:
error in connection: "Connection refused"