QTcpSocket-client automatisch erneut verbinden

Ich versuche zu schreiben, ein Stück code, der in regelmäßigen Abständen versucht, eine Verbindung zum server mithilfe der QTcpSocket, bis der server hochgefahren ist und fertig. Sollte der client auch automatisch und in regelmäßigen Abständen versuchen Sie, wenn der server down ist, bis es sich wieder oder Benutzer manuell beendet das Programm.

Was ich gemacht habe, ist das abonnieren des verbunden-und Fehler-Signale der QTcpSocket. Wenn ich den Fehler abzufangen signal, der ich im Grunde nennen connectToHost Methode wieder.

Mein code in regelmäßigen Abständen versucht, eine Verbindung zu dem host, bis der server bereit ist (dieser Teil funktioniert). Das problem ist jedoch, wenn der server down ist, kann es nie wieder anschließen. Wenn die Verbindung down ist, bekomme ich RemoteHostClosedError als erwartet. Aber, nach dem Aufruf der connectToHost Methode wieder von innen nach der gleichen Methode (wo Fang ich RemoteHostClosedError) habe ich nichts. Auch das error-signal wird nicht emittiert, die von der QTcpSocket-Objekt.

Gab ich meinen code unten.

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);
}

}

Überprüfe ich den Zustand der QTcpSocket vor und nach dem Aufruf der connectToHost Methode (die Letzte Zeile gab ich hier). Vor dem Aufruf connectToHost der Staat ist UnconnectedState und nach dem Aufruf connectToHost seinen Zustand wird die Verbindung. Nichts unerwartetes. Aber, weder kann es die Verbindung zum server, noch emittieren ein Fehlersignal.

Irgendeine Idee?

Hinweis: Die connectToHost metod der QTcpSocket wird intern aufgerufen, für die erste Zeit.

Nicht wieder aus dem error-handler-slot. "Wenn das signal emittiert wird, wird der socket kann nicht bereit sein, einen reconnect-Versuch." qt-Dokumentation

InformationsquelleAutor Furkan | 2012-07-22

Schreibe einen Kommentar