サーバーが起動して準備が整うまで、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);
}
}
connectToHost メソッドを呼び出す前後の QTcpSocket の状態を確認します (ここで指定した最後の行)。connectToHost を呼び出す前の状態は UnconnectedState であり、connectToHost を呼び出した後の状態は Connecting になります。予想外のことは何もありません。ただし、サーバーに接続することも、エラー信号を発することもできません。
何か案が?
注: QTcpSocket の connectToHost メソッドは、初めて内部的に呼び出されます。