diff options
author | Alex Trotsenko <alex1973tr@gmail.com> | 2015-12-08 16:14:57 +0200 |
---|---|---|
committer | Alex Trotsenko <alex1973tr@gmail.com> | 2016-01-04 06:39:31 +0000 |
commit | 55f0343a99ffd920e2e14ba2bb7669d78224fe42 (patch) | |
tree | 5d917c39e41f55b766d747c09d9e6a06118d911b /src/network | |
parent | 090bf50771ec1e5d089b0ae0488059a5643883b2 (diff) |
Do not discard WSAECONNRESET error code from UDP under Windows
When a datagram is sent to a closed host/port combination, the host will
likely send back an ICMP error message. In the regular socket API, there
isn't a good way of actually receiving this error, so some Windows kernels
wired that message back up to the call to WSARecvFrom() as a synthetic
datagram. Reading this datagram results in a WSAECONNRESET error code,
which should reported to the user as a refused connection attempt.
To make the errors a bit more informative, the native error strings for
WSAECONNRESET and WSAENETRESET were also added.
Task-number: QTBUG-49301
Change-Id: If659be54ba1b39965b5f481f0c0cb9eeea0a06d2
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Reviewed-by: Markus Goetz (Woboq GmbH) <markus@woboq.com>
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/socket/qnativesocketengine.cpp | 6 | ||||
-rw-r--r-- | src/network/socket/qnativesocketengine_p.h | 2 | ||||
-rw-r--r-- | src/network/socket/qnativesocketengine_win.cpp | 12 |
3 files changed, 19 insertions, 1 deletions
diff --git a/src/network/socket/qnativesocketengine.cpp b/src/network/socket/qnativesocketengine.cpp index 386e0e2cc7..dfece60036 100644 --- a/src/network/socket/qnativesocketengine.cpp +++ b/src/network/socket/qnativesocketengine.cpp @@ -275,6 +275,12 @@ void QNativeSocketEnginePrivate::setError(QAbstractSocket::SocketError error, Er case TemporaryErrorString: socketErrorString = QNativeSocketEngine::tr("Temporary error"); break; + case NetworkDroppedConnectionErrorString: + socketErrorString = QNativeSocketEngine::tr("Network dropped connection on reset"); + break; + case ConnectionResetErrorString: + socketErrorString = QNativeSocketEngine::tr("Connection reset by peer"); + break; case UnknownSocketErrorString: socketErrorString = QNativeSocketEngine::tr("Unknown error"); break; diff --git a/src/network/socket/qnativesocketengine_p.h b/src/network/socket/qnativesocketengine_p.h index c49ef2c3ad..e540b47069 100644 --- a/src/network/socket/qnativesocketengine_p.h +++ b/src/network/socket/qnativesocketengine_p.h @@ -229,6 +229,8 @@ public: NotSocketErrorString, InvalidProxyTypeString, TemporaryErrorString, + NetworkDroppedConnectionErrorString, + ConnectionResetErrorString, UnknownSocketErrorString = -1 }; diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp index 708be2dea7..d673d3a15e 100644 --- a/src/network/socket/qnativesocketengine_win.cpp +++ b/src/network/socket/qnativesocketengine_win.cpp @@ -1250,7 +1250,17 @@ qint64 QNativeSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 maxL ret = qint64(bytesRead) > maxLength ? maxLength : qint64(bytesRead); } else { WS_ERROR_DEBUG(err); - setError(QAbstractSocket::NetworkError, ReceiveDatagramErrorString); + switch (err) { + case WSAENETRESET: + setError(QAbstractSocket::NetworkError, NetworkDroppedConnectionErrorString); + break; + case WSAECONNRESET: + setError(QAbstractSocket::ConnectionRefusedError, ConnectionResetErrorString); + break; + default: + setError(QAbstractSocket::NetworkError, ReceiveDatagramErrorString); + break; + } ret = -1; } } else { |