diff options
author | Sébastien Dailly <sebastien@dailly.me> | 2024-04-13 22:59:43 +0200 |
---|---|---|
committer | Sébastien Dailly <sebastien@dailly.me> | 2024-04-13 22:59:43 +0200 |
commit | 89d3bb2421a42dccd4f159b77e9f7fb103a4f8b8 (patch) | |
tree | edc50f8e27a8aba6449297a425e46d2d34378c32 /socket_conn.py | |
parent | c27035a029cdcbfb854ea0760fd083b5d8870c6d (diff) |
Reliable connection in the sockets
Diffstat (limited to 'socket_conn.py')
-rwxr-xr-x | socket_conn.py | 12 |
1 files changed, 10 insertions, 2 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:
|