From e26d4da52f8795830b20df580a596e4cce56c13a Mon Sep 17 00:00:00 2001 From: Sven Slootweg Date: Wed, 23 May 2012 08:42:05 +0200 Subject: [PATCH] Now using select for reading out sockets --- distribution-server/dist-daemon | 62 +++++++++++++++++++++------------ node/node-daemon | 2 +- 2 files changed, 41 insertions(+), 23 deletions(-) mode change 100644 => 100755 node/node-daemon diff --git a/distribution-server/dist-daemon b/distribution-server/dist-daemon index 31cdc91..2d33a62 100755 --- a/distribution-server/dist-daemon +++ b/distribution-server/dist-daemon @@ -9,9 +9,15 @@ key_path = '/home/sven/ssl/private' # Configuration ends here ################################ -import socket, ssl +import socket, ssl, select + +def remove_from_list(ls, val): + return [value for value in ls if value is not val] client_list = [] +client_map = {} +select_inputs = [] +select_outputs = [] class Client: def __init__(self, connstream): @@ -34,26 +40,38 @@ bindsocket = socket.socket() bindsocket.bind(('0.0.0.0', 9151)) bindsocket.listen(5) -while True: - try: - newsocket, fromaddr = bindsocket.accept() - connstream = ssl.wrap_socket(newsocket, - server_side=True, - certfile=cert_path, - keyfile=key_path, - ssl_version=ssl.PROTOCOL_TLSv1) - try: - client_list.append(Client(connstream)) - print client_list - finally: +select_inputs = [ bindsocket ] + +while select_inputs: + readable, writable, exceptional = select.select(select_inputs, select_outputs, select_inputs) + + for sock in readable: + if sock is bindsocket: try: - connstream.shutdown(socket.SHUT_RDWR) - except socket.error: - # todo: handle exception, connection broke - pass + newsocket, fromaddr = bindsocket.accept() + connstream = ssl.wrap_socket(newsocket, + server_side=True, + certfile=cert_path, + keyfile=key_path, + ssl_version=ssl.PROTOCOL_TLSv1) - connstream.close() - except ssl.SSLError: - # todo: handle exception, SSL initialization failed? - pass - + new_client = Client(connstream) + + select_inputs.append(connstream) + client_map[connstream.fileno()] = new_client + client_list.append(new_client) + except ssl.SSLError: + # todo: handle exception, SSL initialization failed? + pass + else: + data = sock.recv(1024) + + if data: + print sock.fileno() + print sock.read() + else: + select_inputs = remove_from_list(select_inputs, sock) + print "NOTICE: Client disconnected" + + +print "Server socket closed, exiting..." diff --git a/node/node-daemon b/node/node-daemon old mode 100644 new mode 100755 index 590105c..2384368 --- a/node/node-daemon +++ b/node/node-daemon @@ -8,7 +8,7 @@ allowed_certs = '/home/sven/ssl/allowed' # Configuration ends here ################################ -import socket, ssl, pprint +import socket, ssl, pprint, time s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ssl_sock = ssl.wrap_socket(s, cert_reqs=ssl.CERT_REQUIRED, ca_certs=allowed_certs)