From 6f61cfc33810054173a17443b20bfa2dce737285 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Wed, 6 Jul 2016 17:21:51 +0300 Subject: QNativeSocketEngine/Win: fetch connection parameters only once Exclude sections of code that relate to 'Connecting' state from being executed in 'Connected' state. Change-Id: I5e7d28b74dcd9c87c37b4871cc90afc200b2dab9 Reviewed-by: Edward Welbourne --- src/network/socket/qnativesocketengine.cpp | 84 ++++++++++++++++-------------- 1 file changed, 44 insertions(+), 40 deletions(-) (limited to 'src/network') diff --git a/src/network/socket/qnativesocketengine.cpp b/src/network/socket/qnativesocketengine.cpp index 9af3aa0d31..7c70d664e7 100644 --- a/src/network/socket/qnativesocketengine.cpp +++ b/src/network/socket/qnativesocketengine.cpp @@ -1007,26 +1007,28 @@ bool QNativeSocketEngine::waitForWrite(int msecs, bool *timedOut) // select(writable) is successful. In this case we should not // issue a second call to WSAConnect() #if defined (Q_OS_WIN) - if (ret > 0) { - setState(QAbstractSocket::ConnectedState); - d_func()->fetchConnectionParameters(); - return true; - } else { - int value = 0; - int valueSize = sizeof(value); - if (::getsockopt(d->socketDescriptor, SOL_SOCKET, SO_ERROR, (char *) &value, &valueSize) == 0) { - if (value == WSAECONNREFUSED) { - d->setError(QAbstractSocket::ConnectionRefusedError, QNativeSocketEnginePrivate::ConnectionRefusedErrorString); - d->socketState = QAbstractSocket::UnconnectedState; - return false; - } else if (value == WSAETIMEDOUT) { - d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::ConnectionTimeOutErrorString); - d->socketState = QAbstractSocket::UnconnectedState; - return false; - } else if (value == WSAEHOSTUNREACH) { - d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::HostUnreachableErrorString); - d->socketState = QAbstractSocket::UnconnectedState; - return false; + if (state() == QAbstractSocket::ConnectingState) { + if (ret > 0) { + setState(QAbstractSocket::ConnectedState); + d_func()->fetchConnectionParameters(); + return true; + } else { + int value = 0; + int valueSize = sizeof(value); + if (::getsockopt(d->socketDescriptor, SOL_SOCKET, SO_ERROR, (char *) &value, &valueSize) == 0) { + if (value == WSAECONNREFUSED) { + d->setError(QAbstractSocket::ConnectionRefusedError, QNativeSocketEnginePrivate::ConnectionRefusedErrorString); + d->socketState = QAbstractSocket::UnconnectedState; + return false; + } else if (value == WSAETIMEDOUT) { + d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::ConnectionTimeOutErrorString); + d->socketState = QAbstractSocket::UnconnectedState; + return false; + } else if (value == WSAEHOSTUNREACH) { + d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::HostUnreachableErrorString); + d->socketState = QAbstractSocket::UnconnectedState; + return false; + } } } } @@ -1060,26 +1062,28 @@ bool QNativeSocketEngine::waitForReadOrWrite(bool *readyToRead, bool *readyToWri // select(writable) is successful. In this case we should not // issue a second call to WSAConnect() #if defined (Q_OS_WIN) - if (checkWrite && ((readyToWrite && *readyToWrite) || !readyToWrite) && ret > 0) { - setState(QAbstractSocket::ConnectedState); - d_func()->fetchConnectionParameters(); - return true; - } else { - int value = 0; - int valueSize = sizeof(value); - if (::getsockopt(d->socketDescriptor, SOL_SOCKET, SO_ERROR, (char *) &value, &valueSize) == 0) { - if (value == WSAECONNREFUSED) { - d->setError(QAbstractSocket::ConnectionRefusedError, QNativeSocketEnginePrivate::ConnectionRefusedErrorString); - d->socketState = QAbstractSocket::UnconnectedState; - return false; - } else if (value == WSAETIMEDOUT) { - d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::ConnectionTimeOutErrorString); - d->socketState = QAbstractSocket::UnconnectedState; - return false; - } else if (value == WSAEHOSTUNREACH) { - d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::HostUnreachableErrorString); - d->socketState = QAbstractSocket::UnconnectedState; - return false; + if (state() == QAbstractSocket::ConnectingState) { + if (checkWrite && ((readyToWrite && *readyToWrite) || !readyToWrite) && ret > 0) { + setState(QAbstractSocket::ConnectedState); + d_func()->fetchConnectionParameters(); + return true; + } else { + int value = 0; + int valueSize = sizeof(value); + if (::getsockopt(d->socketDescriptor, SOL_SOCKET, SO_ERROR, (char *) &value, &valueSize) == 0) { + if (value == WSAECONNREFUSED) { + d->setError(QAbstractSocket::ConnectionRefusedError, QNativeSocketEnginePrivate::ConnectionRefusedErrorString); + d->socketState = QAbstractSocket::UnconnectedState; + return false; + } else if (value == WSAETIMEDOUT) { + d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::ConnectionTimeOutErrorString); + d->socketState = QAbstractSocket::UnconnectedState; + return false; + } else if (value == WSAEHOSTUNREACH) { + d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::HostUnreachableErrorString); + d->socketState = QAbstractSocket::UnconnectedState; + return false; + } } } } -- cgit v1.2.3