From 2ce53ba9f0f03ac024ac206fc521dcc9d4cfe456 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 5 Oct 2017 17:06:22 +0200 Subject: Retry a few times when connecting to a tcp host This way we don't need a complicated synchronization setup when the data is tunneled through an SSH connection, which might take a while to start. Change-Id: Ib42aede7e751258e928224326ee46fe9252be8b3 Reviewed-by: hjk --- app/main.cpp | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/app/main.cpp b/app/main.cpp index 7d944f0..491b097 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #ifdef Q_OS_WIN @@ -56,14 +57,18 @@ enum ErrorCodes { class PerfTcpSocket : public QTcpSocket { Q_OBJECT public: - PerfTcpSocket(QCoreApplication *app); + PerfTcpSocket(QCoreApplication *app, const QString &host, quint16 port); + void tryConnect(); public slots: void readingFinished(); void processError(QAbstractSocket::SocketError error); private: - bool reading; + QString host; + quint16 port = 0; + quint16 tries = 0; + bool reading = true; }; int main(int argc, char *argv[]) @@ -201,7 +206,8 @@ int main(int argc, char *argv[]) QScopedPointer infile; if (parser.isSet(host)) { - PerfTcpSocket *socket = new PerfTcpSocket(&app); + PerfTcpSocket *socket = new PerfTcpSocket(&app, parser.value(host), + parser.value(port).toUShort()); infile.reset(socket); } else { if (parser.isSet(input)) @@ -299,8 +305,7 @@ int main(int argc, char *argv[]) PerfTcpSocket *socket = static_cast(infile.data()); QObject::connect(socket, &QTcpSocket::disconnected, &data, &PerfData::finishReading); QObject::connect(&data, &PerfData::finished, socket, &PerfTcpSocket::readingFinished); - socket->connectToHost(parser.value(host), parser.value(port).toUShort(), - QIODevice::ReadOnly); + socket->tryConnect(); } else { if (!infile->open(QIODevice::ReadOnly)) return CannotOpen; @@ -315,17 +320,27 @@ void PerfTcpSocket::processError(QAbstractSocket::SocketError error) { if (reading) { qWarning() << "socket error" << error << errorString(); - qApp->exit(TcpSocketError); + if (tries > 10) + qApp->exit(TcpSocketError); + else + QTimer::singleShot(1 << tries, this, &PerfTcpSocket::tryConnect); } // Otherwise ignore the error. We don't need the socket anymore } -PerfTcpSocket::PerfTcpSocket(QCoreApplication *app) : QTcpSocket(app), reading(true) +PerfTcpSocket::PerfTcpSocket(QCoreApplication *app, const QString &host, quint16 port) : + QTcpSocket(app), host(host), port(port) { connect(this, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(processError(QAbstractSocket::SocketError))); } +void PerfTcpSocket::tryConnect() +{ + ++tries; + connectToHost(host, port, QIODevice::ReadOnly); +} + void PerfTcpSocket::readingFinished() { reading = false; -- cgit v1.2.3