From 46aace37db5c035a6d6b432db261dc7c417456f4 Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Sat, 22 Aug 2015 19:15:22 +0200 Subject: make protocol work, some gui stuff --- voctocore/lib/tcpmulticonnection.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'voctocore/lib/tcpmulticonnection.py') diff --git a/voctocore/lib/tcpmulticonnection.py b/voctocore/lib/tcpmulticonnection.py index 927ac06..e6f8b5b 100644 --- a/voctocore/lib/tcpmulticonnection.py +++ b/voctocore/lib/tcpmulticonnection.py @@ -1,5 +1,6 @@ #!/usr/bin/python3 import logging, socket +from queue import Queue from gi.repository import GObject from lib.config import Config @@ -10,7 +11,7 @@ class TCPMultiConnection(object): self.log = logging.getLogger('TCPMultiConnection') self.boundSocket = None - self.currentConnections = [] + self.currentConnections = dict() self.log.debug('Binding to Source-Socket on [::]:%u', port) self.boundSocket = socket.socket(socket.AF_INET6) @@ -24,9 +25,11 @@ class TCPMultiConnection(object): def on_connect(self, sock, *args): conn, addr = sock.accept() + conn.setblocking(False) + self.log.info("Incomming Connection from %s", addr) - self.currentConnections.append(conn) + self.currentConnections[conn] = Queue() self.log.info('Now %u Receiver connected', len(self.currentConnections)) self.on_accepted(conn, addr) @@ -34,5 +37,5 @@ class TCPMultiConnection(object): return True def close_connection(self, conn): - self.currentConnections.remove(conn) + del(self.currentConnections[conn]) self.log.info('Now %u Receiver connected', len(self.currentConnections)) -- cgit v1.2.3 From 13ef8b7d796025f412874349929296e01dab2672 Mon Sep 17 00:00:00 2001 From: MaZderMind Date: Wed, 2 Sep 2015 15:17:54 +0200 Subject: fix command server when dealing with very short lived connections, like --- voctocore/lib/controlserver.py | 17 ++++++++++++++--- voctocore/lib/tcpmulticonnection.py | 3 ++- 2 files changed, 16 insertions(+), 4 deletions(-) (limited to 'voctocore/lib/tcpmulticonnection.py') diff --git a/voctocore/lib/controlserver.py b/voctocore/lib/controlserver.py index e0632fc..631770b 100644 --- a/voctocore/lib/controlserver.py +++ b/voctocore/lib/controlserver.py @@ -28,14 +28,17 @@ class ControlServer(TCPMultiConnection): def on_data(self, conn, _, leftovers, *args): '''Asynchronous connection handler. Pushes data from socket into command queue linewise''' + close_after = False try: while True: try: leftovers.append(conn.recv(4096).decode(errors='replace')) if len(leftovers[-1]) == 0: self.log.info("Socket was closed") - self.close_connection(conn) - return False + leftovers.pop() + close_after = True + break + except UnicodeDecodeError as e: continue except BlockingIOError as e: @@ -58,6 +61,10 @@ class ControlServer(TCPMultiConnection): self.command_queue.put((line, conn)) + if close_after: + self.close_connection(conn) + return False + self.log.debug("Remaining %r", lines[-1]) leftovers.append(lines[-1]) return True @@ -70,6 +77,9 @@ class ControlServer(TCPMultiConnection): line, requestor = self.command_queue.get() words = line.split() + if len(words) < 1: + return True + command = words[0] args = words[1:] @@ -99,7 +109,8 @@ class ControlServer(TCPMultiConnection): response = "%s\n" % str(responseObject) finally: - self.currentConnections[requestor].put(response) + if requestor in self.currentConnections: + self.currentConnections[requestor].put(response) return True diff --git a/voctocore/lib/tcpmulticonnection.py b/voctocore/lib/tcpmulticonnection.py index e6f8b5b..e9caf2c 100644 --- a/voctocore/lib/tcpmulticonnection.py +++ b/voctocore/lib/tcpmulticonnection.py @@ -37,5 +37,6 @@ class TCPMultiConnection(object): return True def close_connection(self, conn): - del(self.currentConnections[conn]) + if conn in self.currentConnections: + del(self.currentConnections[conn]) self.log.info('Now %u Receiver connected', len(self.currentConnections)) -- cgit v1.2.3