summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp8
-rw-r--r--tests/auto/qtcpserver/tst_qtcpserver.cpp17
2 files changed, 24 insertions, 1 deletions
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index b32755d..0a087d5 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -325,7 +325,13 @@ bool QNativeSocketEnginePrivate::setOption(QNativeSocketEngine::SocketOption opt
}
case QNativeSocketEngine::AddressReusable:
#if defined(SO_REUSEPORT)
- n = SO_REUSEPORT;
+ // on OS X, SO_REUSEADDR isn't sufficient to allow multiple binds to the
+ // same port (which is useful for multicast UDP). SO_REUSEPORT is, but
+ // we most definitely do not want to use this for TCP. See QTBUG-6305.
+ if (socketType == QAbstractSocket::UdpSocket)
+ n = SO_REUSEPORT;
+ else
+ n = SO_REUSEADDR;
#else
n = SO_REUSEADDR;
#endif
diff --git a/tests/auto/qtcpserver/tst_qtcpserver.cpp b/tests/auto/qtcpserver/tst_qtcpserver.cpp
index 9f862b9..0052518 100644
--- a/tests/auto/qtcpserver/tst_qtcpserver.cpp
+++ b/tests/auto/qtcpserver/tst_qtcpserver.cpp
@@ -113,6 +113,8 @@ private slots:
void qtbug14268_peek();
+ void qtbug6305();
+
private:
#ifndef QT_NO_BEARERMANAGEMENT
QNetworkSession *networkSession;
@@ -788,5 +790,20 @@ void tst_QTcpServer::qtbug14268_peek()
QVERIFY(helper.lastDataPeeked == QByteArray("6162630a6465660a6768690a"));
}
+// on OS X, calling listen() multiple times would succeed each time, which is
+// most definitely not wanted.
+void tst_QTcpServer::qtbug6305()
+{
+ QFETCH_GLOBAL(bool, setProxy);
+ if (setProxy)
+ return;
+
+ QTcpServer server;
+ QVERIFY2(server.listen(QHostAddress::Any), qPrintable(server.errorString()));
+
+ QTcpServer server2;
+ QVERIFY(!server2.listen(QHostAddress::Any, server.serverPort())); // second listen should fail
+}
+
QTEST_MAIN(tst_QTcpServer)
#include "tst_qtcpserver.moc"