From 89d3bb2421a42dccd4f159b77e9f7fb103a4f8b8 Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Sat, 13 Apr 2024 22:59:43 +0200 Subject: Reliable connection in the sockets --- socket_conn.py | 12 ++++++++++-- socketserver.py | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/socket_conn.py b/socket_conn.py index 433cc75..4367240 100755 --- a/socket_conn.py +++ b/socket_conn.py @@ -6,6 +6,7 @@ import socket from zope import interface import errno +import select from interfaces import endpoint @@ -25,15 +26,22 @@ class SocketConnection(object): """ Connect """ self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.s.connect((self.host, self.port)) - self.s.settimeout(0.0) component.handle(Debug("Connected to the socket")) def read(self) -> str: """ Read from the connection and return the bytes. Return None if there is nothing to read (non-blocking) Raise an exception if disconnected """ + # check the socket for reading in non-blocking mode + read_socket, _, _ = select.select([self.s], [], [], 0.0) + if read_socket == []: return try: - return self.s.recv(1024) + recv = self.s.recv(1024) + if recv == b"": + # We should be able to read something, but got nothing. + # Reset the socket + raise RuntimeError("socket connection broken") + return recv except socket.error as e: err = e.args[0] if err == errno.EAGAIN or err == errno.EWOULDBLOCK: diff --git a/socketserver.py b/socketserver.py index 471b8be..0a7e9d4 100755 --- a/socketserver.py +++ b/socketserver.py @@ -104,12 +104,12 @@ class Handler(object): def _read(self:object, conn:socket, mask:int): """ Internal method used to retreive data from the socket """ - data = conn.recv(1024).strip() + data = conn.recv(1024) if data == bytes("", "ascii"): # A socket ready but sending garbage is a dead socket. self.close(conn) return - json_data = str(data, "utf-8") + json_data = str(data.strip(), "utf-8") try: js = json.loads(json_data) for key in js.keys(): -- cgit v1.2.3