summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2017-10-05 17:06:22 +0200
committerUlf Hermann <ulf.hermann@qt.io>2017-10-06 11:17:15 +0000
commit2ce53ba9f0f03ac024ac206fc521dcc9d4cfe456 (patch)
treef59b8ea175e23f09125eaec0e7c8a5665252a83b
parent7971c377ee271ceae3e2d85847ae93224ac41d2e (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.cpp29
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;