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
parent
0492f4a4c5
commit
6f61cfc338
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue