Я пытаюсь написать фрагмент кода, который периодически пытается подключиться к серверу с помощью QTcpSocket, пока сервер не будет готов. Клиент также должен автоматически и периодически пытаться переподключиться, когда сервер не работает, пока он снова не включится, или пользователь вручную не закроет программу.
Что я сделал, так это подписался на подключенные и ошибочные сигналы QTcpSocket. Когда я ловлю сигнал об ошибке, я снова вызываю метод connectToHost.
Мой код периодически пытается подключиться к хосту, пока сервер не будет готов (эта часть работает нормально). Однако проблема в том, что когда сервер не работает, он никогда не сможет восстановить соединение. Когда соединение не работает, я получаю RemoteHostClosedError, как и ожидалось. Но после повторного вызова метода connectToHost внутри того же метода (где я ловлю RemoteHostClosedError) я ничего не получил. Даже сигнал ошибки не выдается объектом QTcpSocket.
Я дал свой код ниже.
TcpServerConnector::TcpServerConnector( SocketSettings socketSettings, QObject* parent)
: QObject(parent), socket(new QTcpSocket())
{
this->connect(this->socket, SIGNAL(connected()), this, SLOT(connectionSuccess_Handler()), Qt::DirectConnection);
this->connect(this->socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(connectionError_Handler(QAbstractSocket::SocketError)), Qt::DirectConnection);
}
void TcpServerConnector::connectionError_Handler( QAbstractSocket::SocketError error )
{
switch (error)
{
case QAbstractSocket::AddressInUseError:
this->logger.log(LogLevel::ERR, "SOCKET ERROR: Address is already in use");
break;
case QAbstractSocket::ConnectionRefusedError:
this->logger.log(LogLevel::ERR, "SOCKET ERROR: Connection refused");
break;
case QAbstractSocket::HostNotFoundError:
this->logger.log(LogLevel::ERR, "SOCKET ERROR: Host not found");
break;
case QAbstractSocket::RemoteHostClosedError:
this->logger.log(LogLevel::ERR, "SOCKET ERROR: Remote host closed");
break;
}
this->socket->abort();
this->socket->close();
this->logger.log(LogLevel::DEBUG, "Reconnecting...");
SystemUtil::sleepCurrentThread(1000);
this->socket->connectToHost(ip_address, port);
}
}
Я проверяю состояние QTcpSocket до и после вызова метода connectToHost (последняя строка, которую я здесь привел). Перед вызовом connectToHost состояние UnconnectedState, а после вызова connectToHost его состояние становится Connecting. Ничего неожиданного. Однако он не может ни подключиться к серверу, ни выдать сигнал об ошибке.
Любая идея?
Примечание. Метод connectToHost QTcpSocket вызывается внутри в первый раз.