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 <edward.welbourne@qt.io>
bb10
Alex Trotsenko 2016-07-06 17:21:51 +03:00
parent 0492f4a4c5
commit 6f61cfc338
1 changed files with 44 additions and 40 deletions

View File

@ -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;
}
}
}
}