summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDaniel Nicoletti <daniel.nicoletti@kdab.com>2021-06-30 17:18:02 -0300
committerDaniel Nicoletti <daniel.nicoletti@kdab.com>2021-07-27 16:47:31 -0300
commit8f75ab231fafc136fef4b973f1241b9b2db30312 (patch)
treec634d4ba891a6d13f06368f502eba81f7f61e2ae /src
parente4fd86d53af3e7a949752f5558c137bb1c8c5fa6 (diff)
Allow to set Local Socket listen(2) backlog
Unix sockets do not suffer from SYN flood, thus the hardcoded value to 50 is size of the only queue to hold connections to be accepted, resulting in dropped connections when the limit is reached. On Windows the hardcoded value is 8, this patch changes the default to 50 matching UNIX. [ChangeLog][QtNetwork][QLocalServer] Added setListenBacklogSize() to be able to have control over the listen backlog feature. Change-Id: Iaee6349a46b75b0bd05e40e7ade5948f1cf9f407 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src')
-rw-r--r--src/network/socket/qlocalserver.cpp30
-rw-r--r--src/network/socket/qlocalserver.h3
-rw-r--r--src/network/socket/qlocalserver_p.h1
-rw-r--r--src/network/socket/qlocalserver_tcp.cpp2
-rw-r--r--src/network/socket/qlocalserver_unix.cpp2
-rw-r--r--src/network/socket/qlocalserver_win.cpp5
-rw-r--r--src/network/socket/qtcpserver.cpp13
-rw-r--r--src/network/socket/qtcpserver.h4
8 files changed, 46 insertions, 14 deletions
diff --git a/src/network/socket/qlocalserver.cpp b/src/network/socket/qlocalserver.cpp
index 6517d6dc6a..0e0cd755a4 100644
--- a/src/network/socket/qlocalserver.cpp
+++ b/src/network/socket/qlocalserver.cpp
@@ -554,6 +554,36 @@ bool QLocalServer::waitForNewConnection(int msec, bool *timedOut)
return !d->pendingConnections.isEmpty();
}
+/*!
+ 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 property must be set prior to calling listen().
+
+ \since 6.3
+
+ \sa listenBacklogSize()
+*/
+void QLocalServer::setListenBacklogSize(int size)
+{
+ Q_D(QLocalServer);
+ d->listenBacklog = size;
+}
+
+/*!
+ Returns the backlog queue size of to be accepted connections.
+
+ \since 6.3
+
+ \sa setListenBacklogSize()
+*/
+int QLocalServer::listenBacklogSize() const
+{
+ Q_D(const QLocalServer);
+ return d->listenBacklog;
+}
+
QT_END_NAMESPACE
#include "moc_qlocalserver.cpp"
diff --git a/src/network/socket/qlocalserver.h b/src/network/socket/qlocalserver.h
index f4ae63e6c4..9106bcad45 100644
--- a/src/network/socket/qlocalserver.h
+++ b/src/network/socket/qlocalserver.h
@@ -93,6 +93,9 @@ public:
void setMaxPendingConnections(int numConnections);
bool waitForNewConnection(int msec = 0, bool *timedOut = nullptr);
+ void setListenBacklogSize(int size);
+ int listenBacklogSize() const;
+
void setSocketOptions(SocketOptions options);
SocketOptions socketOptions() const;
QBindable<SocketOptions> bindableSocketOptions();
diff --git a/src/network/socket/qlocalserver_p.h b/src/network/socket/qlocalserver_p.h
index 5907874b60..bbaad80254 100644
--- a/src/network/socket/qlocalserver_p.h
+++ b/src/network/socket/qlocalserver_p.h
@@ -126,6 +126,7 @@ public:
QQueue<QLocalSocket*> pendingConnections;
QString errorString;
QAbstractSocket::SocketError error;
+ int listenBacklog = 50;
Q_OBJECT_BINDABLE_PROPERTY(QLocalServerPrivate, QLocalServer::SocketOptions, socketOptions)
};
diff --git a/src/network/socket/qlocalserver_tcp.cpp b/src/network/socket/qlocalserver_tcp.cpp
index b3f1188afa..1c46d75f52 100644
--- a/src/network/socket/qlocalserver_tcp.cpp
+++ b/src/network/socket/qlocalserver_tcp.cpp
@@ -56,6 +56,8 @@ void QLocalServerPrivate::init()
bool QLocalServerPrivate::listen(const QString &requestedServerName)
{
+ tcpServer.setListenBacklogSize(listenBacklog);
+
if (!tcpServer.listen(QHostAddress::LocalHost))
return false;
diff --git a/src/network/socket/qlocalserver_unix.cpp b/src/network/socket/qlocalserver_unix.cpp
index 8272778d7f..5840958350 100644
--- a/src/network/socket/qlocalserver_unix.cpp
+++ b/src/network/socket/qlocalserver_unix.cpp
@@ -184,7 +184,7 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName)
}
// listen for connections
- if (-1 == qt_safe_listen(listenSocket, 50)) {
+ if (-1 == qt_safe_listen(listenSocket, listenBacklog)) {
setError(QLatin1String("QLocalServer::listen"));
closeServer();
return false;
diff --git a/src/network/socket/qlocalserver_win.cpp b/src/network/socket/qlocalserver_win.cpp
index a05722987c..c8b356cb29 100644
--- a/src/network/socket/qlocalserver_win.cpp
+++ b/src/network/socket/qlocalserver_win.cpp
@@ -53,9 +53,6 @@
// before it is read. Pipewriter is used for write buffering.
#define BUFSIZE 0
-// ###: This should be a property. Should replace the insane 50 on unix as well.
-#define SYSTEM_MAX_PENDING_SOCKETS 8
-
QT_BEGIN_NAMESPACE
bool QLocalServerPrivate::addListener()
@@ -256,7 +253,7 @@ bool QLocalServerPrivate::listen(const QString &name)
connectionEventNotifier = new QWinEventNotifier(eventHandle , q);
q->connect(connectionEventNotifier, SIGNAL(activated(HANDLE)), q, SLOT(_q_onNewConnection()));
- for (int i = 0; i < SYSTEM_MAX_PENDING_SOCKETS; ++i)
+ for (int i = 0; i < listenBacklog; ++i)
if (!addListener())
return false;
diff --git a/src/network/socket/qtcpserver.cpp b/src/network/socket/qtcpserver.cpp
index 1a3d122b7f..100bb23340 100644
--- a/src/network/socket/qtcpserver.cpp
+++ b/src/network/socket/qtcpserver.cpp
@@ -654,26 +654,25 @@ int QTcpServer::maxPendingConnections() const
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.
+ \note This property must be set prior to calling listen().
\since 6.3
- \sa listenBacklog()
+ \sa listenBacklogSize()
*/
-void QTcpServer::setListenBacklog(int size)
+void QTcpServer::setListenBacklogSize(int size)
{
d_func()->listenBacklog = size;
}
/*!
- Returns the backlog queue size of to be accepted connections. The
- default is 50.
+ Returns the backlog queue size of to be accepted connections.
\since 6.3
- \sa setListenBacklog()
+ \sa setListenBacklogSize()
*/
-int QTcpServer::listenBacklog() const
+int QTcpServer::listenBacklogSize() const
{
return d_func()->listenBacklog;
}
diff --git a/src/network/socket/qtcpserver.h b/src/network/socket/qtcpserver.h
index c6f5eb3e7f..28bea2f9c7 100644
--- a/src/network/socket/qtcpserver.h
+++ b/src/network/socket/qtcpserver.h
@@ -69,8 +69,8 @@ public:
void setMaxPendingConnections(int numConnections);
int maxPendingConnections() const;
- void setListenBacklog(int size);
- int listenBacklog() const;
+ void setListenBacklogSize(int size);
+ int listenBacklogSize() const;
quint16 serverPort() const;
QHostAddress serverAddress() const;