diff options
author | Shane Kearns <shane.kearns@accenture.com> | 2011-11-30 17:21:51 +0000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-12-01 15:58:57 +0100 |
commit | 1a52819c70306d5af7a10c0841eb0e5a625656a5 (patch) | |
tree | 27a3d2358edc08575b6b925550892d84bffe018c /src | |
parent | 0fc713b436c52b7fe6c247bea661e3f375aa0d9b (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')
-rw-r--r-- | src/network/socket/qnativesocketengine_unix.cpp | 15 | ||||
-rw-r--r-- | src/network/socket/qnativesocketengine_win.cpp | 16 |
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); |