diff options
author | Jonas M. Gastal <jgastal@gmail.com> | 2012-06-11 22:27:03 -0300 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-09-26 04:03:51 +0200 |
commit | 4920090da0fc937d171065694d5274221d2747c9 (patch) | |
tree | 8959b519b3ebcf772fee2db640c0b2b4818a6e85 /src/network/socket/qnativesocketengine_win.cpp | |
parent | aa9728450cc515c66545323646c66d826a1af50a (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.cpp | 35 |
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 |