summaryrefslogtreecommitdiffstats
path: root/src/network/socket
diff options
context:
space:
mode:
authorShane Kearns <shane.kearns@accenture.com>2011-11-30 17:21:51 +0000
committerQt by Nokia <qt-info@nokia.com>2011-12-01 15:58:57 +0100
commit1a52819c70306d5af7a10c0841eb0e5a625656a5 (patch)
tree27a3d2358edc08575b6b925550892d84bffe018c /src/network/socket
parent0fc713b436c52b7fe6c247bea661e3f375aa0d9b (diff)
Fix QTcpServer::serverAddress() for dual stack sockets
When listening on QHostAddress::Any, serverAddress() should return QHostAddress::Any too, assuming that setting the socket options was successful. Task-number: QTBUG-22899 Change-Id: I50a9ff1b4ad0c1c1905e2952c595d7068df2627d Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/network/socket')
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp15
-rw-r--r--src/network/socket/qnativesocketengine_win.cpp16
2 files changed, 31 insertions, 0 deletions
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index ae7e239309..09aed255d6 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -922,6 +922,21 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
return false;
}
+#if defined (IPV6_V6ONLY)
+ // determine if local address is dual mode
+ int ipv6only = 0;
+ socklen_t optlen = sizeof(ipv6only);
+ if (localAddress == QHostAddress::AnyIPv6
+ && !getsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&ipv6only, &optlen )) {
+ if (optlen != sizeof(ipv6only))
+ qWarning("unexpected size of IPV6_V6ONLY socket option");
+ if (!ipv6only) {
+ socketProtocol = QAbstractSocket::AnyIPProtocol;
+ localAddress = QHostAddress::Any;
+ }
+ }
+#endif
+
// Determine the remote address
if (!::getpeername(socketDescriptor, &sa.a, &sockAddrSize))
qt_socket_getPortAndAddress(&sa, &peerPort, &peerAddress);
diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp
index 4be930bb20..247de01072 100644
--- a/src/network/socket/qnativesocketengine_win.cpp
+++ b/src/network/socket/qnativesocketengine_win.cpp
@@ -554,6 +554,22 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
}
}
+#if defined (IPV6_V6ONLY)
+ // determine if local address is dual mode
+ DWORD ipv6only = 0;
+ int optlen = sizeof(ipv6only);
+ if (localAddress == QHostAddress::AnyIPv6
+ && QSysInfo::windowsVersion() >= QSysInfo::WV_6_0
+ && !getsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&ipv6only, &optlen )) {
+ if (optlen != sizeof(ipv6only))
+ qWarning("unexpected size of IPV6_V6ONLY socket option");
+ if (!ipv6only) {
+ socketProtocol = QAbstractSocket::AnyIPProtocol;
+ localAddress = QHostAddress::Any;
+ }
+ }
+#endif
+
memset(&sa, 0, sizeof(sa));
if (::getpeername(socketDescriptor, &sa.a, &sockAddrSize) == 0) {
qt_socket_getPortAndAddress(socketDescriptor, &sa, &peerPort, &peerAddress);