diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2017-10-05 17:06:22 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2017-10-06 11:17:15 +0000 |
commit | 2ce53ba9f0f03ac024ac206fc521dcc9d4cfe456 (patch) | |
tree | f59b8ea175e23f09125eaec0e7c8a5665252a83b | |
parent | 7971c377ee271ceae3e2d85847ae93224ac41d2e (diff) |
Retry a few times when connecting to a tcp hostv4.5.0-rc1v4.5.0-beta1
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 <hjk@qt.io>
-rw-r--r-- | app/main.cpp | 29 |
1 files 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 <QScopedPointer> #include <QAbstractSocket> #include <QTcpSocket> +#include <QTimer> #include <limits> #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<QIODevice> 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<PerfTcpSocket *>(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; |