9

サーバーが起動して準備が整うまで、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 メソッドは、初めて内部的に呼び出されます。

4

3 に答える 3

5

同様の状況に遭遇する可能性がある人にとっては、QTcpSocket のリセット メソッドが問題を解決しました。

于 2012-07-22T18:18:41.200 に答える
1

私はこの状況に遭遇しました。これが解決策です:

    connect(&tcpClient, SIGNAL(disconnected()), SLOT(ReconnectToHost()));


    void ReconnectToHost(){tcpClient.connectToHost(theServerAddress, port);}
于 2013-07-11T11:34:54.470 に答える