From b00b7ee366911f949584cdc6adf5e276a2a731b3 Mon Sep 17 00:00:00 2001 From: Antoine Millet Date: Mon, 31 Jan 2011 17:45:24 +0100 Subject: [PATCH] Better client disconnection handling. --- sjrpc/server/simple.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/sjrpc/server/simple.py b/sjrpc/server/simple.py index 03b6d34..d46c703 100644 --- a/sjrpc/server/simple.py +++ b/sjrpc/server/simple.py @@ -41,8 +41,12 @@ class SimpleRpcServer(ConnectionManager): connection.shutdown(self._on_disconnect) self._listening_sock.close() - def shutdown_client(self, connection): - connection.shutdown(callback=self._on_disconnect) + def shutdown_client(self, fd): + conn = self._clients.get(fd) + self._poll.unregister(fd) + if fd is not None: + del self._clients[fd] + conn.shutdown(callback=self._on_disconnect) def all_connections(self): return set(self._clients.values()) @@ -69,13 +73,11 @@ class SimpleRpcServer(ConnectionManager): except socket.error as err: logging.error('Socket error while receiving from client ' 'fd/%s: %s' % (fd, err)) - connection.shutdown(self._on_disconnect) - del self._clients[fd] + self.shutdown_client(fd) except Exception as err: logging.error('Unknown error while receiving from client ' 'fd/%s: %s' % (fd, err)) - connection.shutdown(self._on_disconnect) - del self._clients[fd] + self.shutdown_client(fd) if event & select.EPOLLOUT: # Data are ready to be written on socket @@ -84,18 +86,15 @@ class SimpleRpcServer(ConnectionManager): except socket.error as err: logging.error('Socket error while sending to the client ' 'fd/%s: %s' % (fd, err)) - connection.shutdown(self._on_disconnect) - del self._clients[fd] + self.shutdown_client(fd) except Exception as err: logging.error('Unknown error while sending to the client ' 'fd/%s: %s' % (fd, err)) - connection.shutdown(self._on_disconnect) - del self._clients[fd] + self.shutdown_client(fd) if event & select.EPOLLHUP: logging.error('Socket HUP fd/%s: %s' % (fd, err)) - connection.shutdown(self._on_disconnect) - del self._clients[fd] + self.shutdown_client(fd) class SimpleSslRpcServer(SimpleRpcServer): -- GitLab