summaryrefslogtreecommitdiffstats
path: root/src/network/socket/qnativesocketengine_win.cpp
diff options
context:
space:
mode:
authorJonas M. Gastal <jgastal@gmail.com>2012-06-11 22:27:03 -0300
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-09-26 04:03:51 +0200
commit4920090da0fc937d171065694d5274221d2747c9 (patch)
tree8959b519b3ebcf772fee2db640c0b2b4818a6e85 /src/network/socket/qnativesocketengine_win.cpp
parentaa9728450cc515c66545323646c66d826a1af50a (diff)
If accept fails, stop accepting new connections and emit error signal.
Task-number: QTBUG-24778 Change-Id: I6c5b685b3f861a0fafc1475c41bb35cede17d712 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/network/socket/qnativesocketengine_win.cpp')
-rw-r--r--src/network/socket/qnativesocketengine_win.cpp35
1 files changed, 34 insertions, 1 deletions
diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp
index ef93455134..0c14e1380b 100644
--- a/src/network/socket/qnativesocketengine_win.cpp
+++ b/src/network/socket/qnativesocketengine_win.cpp
@@ -909,7 +909,40 @@ bool QNativeSocketEnginePrivate::nativeListen(int backlog)
int QNativeSocketEnginePrivate::nativeAccept()
{
int acceptedDescriptor = WSAAccept(socketDescriptor, 0,0,0,0);
- if (acceptedDescriptor != -1 && QAbstractEventDispatcher::instance()) {
+ if (acceptedDescriptor == -1) {
+ int err = WSAGetLastError();
+ switch (err) {
+ case WSAEACCES:
+ setError(QAbstractSocket::SocketAccessError, AccessErrorString);
+ break;
+ case WSAECONNREFUSED:
+ setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString);
+ break;
+ case WSAECONNRESET:
+ setError(QAbstractSocket::NetworkError, RemoteHostClosedErrorString);
+ break;
+ case WSAENETDOWN:
+ setError(QAbstractSocket::NetworkError, NetworkUnreachableErrorString);
+ case WSAENOTSOCK:
+ setError(QAbstractSocket::SocketResourceError, NotSocketErrorString);
+ break;
+ case WSAEINVAL:
+ case WSAEOPNOTSUPP:
+ setError(QAbstractSocket::UnsupportedSocketOperationError, ProtocolUnsupportedErrorString);
+ break;
+ case WSAEFAULT:
+ case WSAEMFILE:
+ case WSAENOBUFS:
+ setError(QAbstractSocket::SocketResourceError, ResourceErrorString);
+ break;
+ case WSAEWOULDBLOCK:
+ setError(QAbstractSocket::TemporaryError, TemporaryErrorString);
+ break;
+ default:
+ setError(QAbstractSocket::UnknownSocketError, UnknownSocketErrorString);
+ break;
+ }
+ } else if (acceptedDescriptor != -1 && QAbstractEventDispatcher::instance()) {
// Because of WSAAsyncSelect() WSAAccept returns a non blocking socket
// with the same attributes as the listening socket including the current
// WSAAsyncSelect(). To be able to change the socket to blocking mode the