summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlex Trotsenko <alex1973tr@gmail.com>2015-12-08 16:14:57 +0200
committerAlex Trotsenko <alex1973tr@gmail.com>2016-01-04 06:39:31 +0000
commit55f0343a99ffd920e2e14ba2bb7669d78224fe42 (patch)
tree5d917c39e41f55b766d747c09d9e6a06118d911b /src
parent090bf50771ec1e5d089b0ae0488059a5643883b2 (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')
-rw-r--r--src/network/socket/qnativesocketengine.cpp6
-rw-r--r--src/network/socket/qnativesocketengine_p.h2
-rw-r--r--src/network/socket/qnativesocketengine_win.cpp12
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 {