Ich versuche, einen Code zu schreiben, der periodisch versucht, eine Verbindung zum Server mit QTcpSocket herzustellen, bis der Server hochgefahren und bereit ist. Der Client sollte auch automatisch und periodisch erneut versuchen, eine Verbindung herzustellen, wenn der Server nicht erreichbar ist, bis er wieder verfügbar ist oder der Benutzer das Programm manuell schließt.
Was ich gemacht habe, besteht darin, die verbundenen und Fehler-Signale von QTcpSocket zu abonnieren. Wenn ich das Fehler-Signal abfange, rufe ich im Grunde genommen die Methode connectToHost erneut auf.
Mein Code versucht periodisch, eine Verbindung zum Host herzustellen, bis der Server bereit ist (dieser Teil funktioniert gut). Das Problem ist jedoch, dass er sich bei einem nicht verfügbaren Server nie wieder verbinden kann. Wenn die Verbindung unterbrochen ist, erhalte ich wie erwartet einen RemoteHostClosedError. Aber nachdem ich die Methode connectToHost erneut im selben Methodenaufruf (wo ich RemoteHostClosedError abfange) aufgerufen habe, passiert nichts. Nicht einmal das Fehler-Signal wird vom QTcpSocket-Objekt ausgelöst.
Ich gebe meinen Code unten an.
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: Adresse wird bereits verwendet");
break;
case QAbstractSocket::ConnectionRefusedError:
this->logger.log(LogLevel::ERR, "SOCKET ERROR: Verbindung abgelehnt");
break;
case QAbstractSocket::HostNotFoundError:
this->logger.log(LogLevel::ERR, "SOCKET ERROR: Host nicht gefunden");
break;
case QAbstractSocket::RemoteHostClosedError:
this->logger.log(LogLevel::ERR, "SOCKET ERROR: Remote-Host geschlossen");
break;
}
this->socket->abort();
this->socket->close();
this->logger.log(LogLevel::DEBUG, "Neu verbinden...");
SystemUtil::sleepCurrentThread(1000);
this->socket->connectToHost(ip_address, port);
}
}
Ich überprüfe den Zustand des QTcpSocket vor und nach dem Aufruf der Methode connectToHost (die letzte Zeile, die ich hier angegeben habe). Vor dem Aufruf von connectToHost ist der Zustand UnconnectedState und nach dem Aufruf von connectToHost wird der Zustand Connecting. Nichts Unerwartetes. Allerdings kann er weder eine Verbindung zum Server herstellen, noch ein Fehler-Signal auslösen.
Irgendwelche Ideen?
Hinweis: Die connectToHost-Methode von QTcpSocket wird intern beim ersten Mal aufgerufen.