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.
InformationsquelleAutor Furkan | 2012-07-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für diejenigen, die kommen können, über mit einer ähnlichen situation, die reset-Methode der QTcpSocket das problem gelöst.
würden Sie bitte posten Sie Ihre Lösung...Tnx 😉
InformationsquelleAutor Furkan
Ich habe solch ein problem.
Was ich falsch gemacht habe ist, ich habe versucht zu
QTcpSocket::connectToHost()
aus in einen slot meiner Klasse, verbunden mitQTcpSocket::error()
signal. Schließlich fand ich eine Lösung in diesem post.Wenn ich mich nicht Irre, das problem ist man kann nicht wieder verbinden, aus dieser slot, weil etwas wichtiges passiert, direkt nach
QTcpSocket::error()
signal emmited und flow controll gibt aus der Prozedur dieQTcpSocket
's Methode, die emittiert das signal, oder so irgendwie brechen Sie die Buchse s-Logik, die Art und Weise.Nicht elegant, aber immer noch one-line-of-code-sollution ist zu nennen
QMetaObject::invokeMethod(m_socket, "connectToHost", Qt::QueuedConnection);
sobald Ihr
handle_socket_error()
slot aufgerufen wurde.Vorsicht, wenn Sie anrufen
QMetaObject::invokeMethod
auf benutzerdefinierte Methode, müssen Sie registriert sein als ein slot.UPD: Schande über mich, aber dieses Problem ist bereits in der Qt -
QAbstractSocket::error()
signal Dokumentation.InformationsquelleAutor Veetaha
Ich bin in dieser situation
dies ist Lösung:
InformationsquelleAutor user2572422