summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Nicoletti <[email protected]>2021-06-29 16:37:41 -0300
committerDaniel Nicoletti <[email protected]>2021-07-19 17:05:53 -0300
commite095fa7f9cb994ec2b2639b58a3c0d822d4d2cf6 (patch)
tree3f71467e3a39062c1f7b95cfd6b98e9c4d174ba8
parent0f32703aa5aee46bb2c0bfe9c8e54f05b82cf0f3 (diff)
Allow to set TCP network listen(2) backlog
Qt has a hardcoded backlog value of 50, this allows for applications to tune this value. Modern kernels have the SYN cookie feature that reduces pressure from an flood attack, the backlog setting however is then a queue for most likely real completed (SYN/ACK) connections hence, it's easy to get clients connections dropped with this very small limit. [ChangeLog][QtNetwork][QTcpServer] Added QTcpServer::setListenBacklog() to be able to have control over the listen backlog feature. Change-Id: I1c78af6d99e012591e214b7e09fa85c485880d48 Reviewed-by: Qt CI Bot <[email protected]> Reviewed-by: Giuseppe D'Angelo <[email protected]>
-rw-r--r--src/network/socket/qabstractsocketengine_p.h2
-rw-r--r--src/network/socket/qhttpsocketengine.cpp3
-rw-r--r--src/network/socket/qhttpsocketengine_p.h2
-rw-r--r--src/network/socket/qnativesocketengine.cpp8
-rw-r--r--src/network/socket/qnativesocketengine_p.h2
-rw-r--r--src/network/socket/qsocks5socketengine.cpp3
-rw-r--r--src/network/socket/qsocks5socketengine_p.h2
-rw-r--r--src/network/socket/qtcpserver.cpp31
-rw-r--r--src/network/socket/qtcpserver.h3
-rw-r--r--src/network/socket/qtcpserver_p.h1
-rw-r--r--tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp6
-rw-r--r--tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp2
12 files changed, 48 insertions, 17 deletions
diff --git a/src/network/socket/qabstractsocketengine_p.h b/src/network/socket/qabstractsocketengine_p.h
index 3d9ce96cb30..2da29384a03 100644
--- a/src/network/socket/qabstractsocketengine_p.h
+++ b/src/network/socket/qabstractsocketengine_p.h
@@ -133,7 +133,7 @@ public:
virtual bool connectToHost(const QHostAddress &address, quint16 port) = 0;
virtual bool connectToHostByName(const QString &name, quint16 port) = 0;
virtual bool bind(const QHostAddress &address, quint16 port) = 0;
- virtual bool listen() = 0;
+ virtual bool listen(int backlog) = 0;
virtual int accept() = 0;
virtual void close() = 0;
diff --git a/src/network/socket/qhttpsocketengine.cpp b/src/network/socket/qhttpsocketengine.cpp
index 6170f114f51..7ba3e178736 100644
--- a/src/network/socket/qhttpsocketengine.cpp
+++ b/src/network/socket/qhttpsocketengine.cpp
@@ -191,8 +191,9 @@ bool QHttpSocketEngine::bind(const QHostAddress &, quint16)
return false;
}
-bool QHttpSocketEngine::listen()
+bool QHttpSocketEngine::listen(int backlog)
{
+ Q_UNUSED(backlog);
qWarning("Operation is not supported");
setError(QAbstractSocket::UnsupportedSocketOperationError,
QLatin1String("Unsupported socket operation"));
diff --git a/src/network/socket/qhttpsocketengine_p.h b/src/network/socket/qhttpsocketengine_p.h
index 0c2c450c81d..492e51fe7f4 100644
--- a/src/network/socket/qhttpsocketengine_p.h
+++ b/src/network/socket/qhttpsocketengine_p.h
@@ -95,7 +95,7 @@ public:
bool connectToHost(const QHostAddress &address, quint16 port) override;
bool connectToHostByName(const QString &name, quint16 port) override;
bool bind(const QHostAddress &address, quint16 port) override;
- bool listen() override;
+ bool listen(int backlog) override;
int accept() override;
void close() override;
diff --git a/src/network/socket/qnativesocketengine.cpp b/src/network/socket/qnativesocketengine.cpp
index 302b714cb4f..d46c3640d25 100644
--- a/src/network/socket/qnativesocketengine.cpp
+++ b/src/network/socket/qnativesocketengine.cpp
@@ -689,7 +689,7 @@ bool QNativeSocketEngine::bind(const QHostAddress &address, quint16 port)
\sa bind(), accept()
*/
-bool QNativeSocketEngine::listen()
+bool QNativeSocketEngine::listen(int backlog)
{
Q_D(QNativeSocketEngine);
Q_CHECK_VALID_SOCKETLAYER(QNativeSocketEngine::listen(), false);
@@ -701,11 +701,7 @@ bool QNativeSocketEngine::listen()
Q_CHECK_TYPE(QNativeSocketEngine::listen(), QAbstractSocket::TcpSocket, false);
#endif
- // We're using a backlog of 50. Most modern kernels support TCP
- // syncookies by default, and if they do, the backlog is ignored.
- // When there is no support for TCP syncookies, this value is
- // fine.
- return d->nativeListen(50);
+ return d->nativeListen(backlog);
}
/*!
diff --git a/src/network/socket/qnativesocketengine_p.h b/src/network/socket/qnativesocketengine_p.h
index e5f0701d141..462a7d24d00 100644
--- a/src/network/socket/qnativesocketengine_p.h
+++ b/src/network/socket/qnativesocketengine_p.h
@@ -138,7 +138,7 @@ public:
bool connectToHost(const QHostAddress &address, quint16 port) override;
bool connectToHostByName(const QString &name, quint16 port) override;
bool bind(const QHostAddress &address, quint16 port) override;
- bool listen() override;
+ bool listen(int backlog) override;
int accept() override;
void close() override;
diff --git a/src/network/socket/qsocks5socketengine.cpp b/src/network/socket/qsocks5socketengine.cpp
index 339116d402f..747a99003fc 100644
--- a/src/network/socket/qsocks5socketengine.cpp
+++ b/src/network/socket/qsocks5socketengine.cpp
@@ -1391,9 +1391,10 @@ bool QSocks5SocketEngine::bind(const QHostAddress &addr, quint16 port)
}
-bool QSocks5SocketEngine::listen()
+bool QSocks5SocketEngine::listen(int backlog)
{
Q_D(QSocks5SocketEngine);
+ Q_UNUSED(backlog);
QSOCKS5_Q_DEBUG << "listen()";
diff --git a/src/network/socket/qsocks5socketengine_p.h b/src/network/socket/qsocks5socketengine_p.h
index 77b461b9441..fd063eb4fa4 100644
--- a/src/network/socket/qsocks5socketengine_p.h
+++ b/src/network/socket/qsocks5socketengine_p.h
@@ -81,7 +81,7 @@ public:
bool connectToHost(const QHostAddress &address, quint16 port) override;
bool connectToHostByName(const QString &name, quint16 port) override;
bool bind(const QHostAddress &address, quint16 port) override;
- bool listen() override;
+ bool listen(int backlog) override;
int accept() override;
void close() override;
diff --git a/src/network/socket/qtcpserver.cpp b/src/network/socket/qtcpserver.cpp
index a404350d982..1a3d122b7fa 100644
--- a/src/network/socket/qtcpserver.cpp
+++ b/src/network/socket/qtcpserver.cpp
@@ -331,7 +331,7 @@ bool QTcpServer::listen(const QHostAddress &address, quint16 port)
return false;
}
- if (!d->socketEngine->listen()) {
+ if (!d->socketEngine->listen(d->listenBacklog)) {
d->serverSocketError = d->socketEngine->error();
d->serverSocketErrorString = d->socketEngine->errorString();
return false;
@@ -650,6 +650,35 @@ int QTcpServer::maxPendingConnections() const
}
/*!
+ Sets the backlog queue size of to be accepted connections to \a
+ size. The operating system might reduce or ignore this value.
+ By default, the queue size is 50.
+
+ \note This setting is only used when listen() is called.
+
+ \since 6.3
+
+ \sa listenBacklog()
+*/
+void QTcpServer::setListenBacklog(int size)
+{
+ d_func()->listenBacklog = size;
+}
+
+/*!
+ Returns the backlog queue size of to be accepted connections. The
+ default is 50.
+
+ \since 6.3
+
+ \sa setListenBacklog()
+*/
+int QTcpServer::listenBacklog() const
+{
+ return d_func()->listenBacklog;
+}
+
+/*!
Returns an error code for the last error that occurred.
\sa errorString()
diff --git a/src/network/socket/qtcpserver.h b/src/network/socket/qtcpserver.h
index 37df12919fa..c6f5eb3e7ff 100644
--- a/src/network/socket/qtcpserver.h
+++ b/src/network/socket/qtcpserver.h
@@ -69,6 +69,9 @@ public:
void setMaxPendingConnections(int numConnections);
int maxPendingConnections() const;
+ void setListenBacklog(int size);
+ int listenBacklog() const;
+
quint16 serverPort() const;
QHostAddress serverAddress() const;
diff --git a/src/network/socket/qtcpserver_p.h b/src/network/socket/qtcpserver_p.h
index 6ee8c5f0b14..8fa9b6337b6 100644
--- a/src/network/socket/qtcpserver_p.h
+++ b/src/network/socket/qtcpserver_p.h
@@ -83,6 +83,7 @@ public:
QAbstractSocket::SocketError serverSocketError;
QString serverSocketErrorString;
+ int listenBacklog = 50;
int maxConnections;
#ifndef QT_NO_NETWORKPROXY
diff --git a/tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp b/tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp
index 88a39eea938..23566a3d701 100644
--- a/tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp
+++ b/tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp
@@ -324,7 +324,7 @@ void tst_PlatformSocketEngine::serverTest()
quint16 port = server.localPort();
// Listen for incoming connections
- QVERIFY(server.listen());
+ QVERIFY(server.listen(50));
QCOMPARE(server.state(), QAbstractSocket::ListeningState);
// Initialize a Tcp socket
@@ -429,7 +429,7 @@ void tst_PlatformSocketEngine::tcpLoopbackPerformance()
quint16 port = server.localPort();
// Listen for incoming connections
- QVERIFY(server.listen());
+ QVERIFY(server.listen(50));
QCOMPARE(server.state(), QAbstractSocket::ListeningState);
// Initialize a Tcp socket
@@ -620,7 +620,7 @@ void tst_PlatformSocketEngine::receiveUrgentData()
QCOMPARE(server.state(), QAbstractSocket::BoundState);
quint16 port = server.localPort();
- QVERIFY(server.listen());
+ QVERIFY(server.listen(50));
QCOMPARE(server.state(), QAbstractSocket::ListeningState);
PLATFORMSOCKETENGINE client;
diff --git a/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp b/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp
index f0cff5da3e1..7bf057cd5af 100644
--- a/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp
+++ b/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp
@@ -453,7 +453,7 @@ void tst_QSocks5SocketEngine::serverTest()
QCOMPARE(server.state(), QAbstractSocket::BoundState);
// Listen for incoming connections
- QVERIFY(server.listen());
+ QVERIFY(server.listen(50));
QCOMPARE(server.state(), QAbstractSocket::ListeningState);
// Initialize a Tcp socket