2017-04-15 3 views
1

Ich versuche, einen einfachen Socket-Server zu entwickeln, der eine nicht blockierende Annahme hat (mit settimeout), aber ich möchte es mit Ctrl-C (KeyboardInterrupt) stoppen können.Wie KeyboardInterrupt innerhalb von socket.timeout Ausnahmebehandler zu fangen?

Mein Code ist dies:

import socket 

host = '127.0.0.1' 
port = 5000 

s = socket.socket() 
s.settimeout(1) 
s.bind((host, port)) 
s.listen(1) 
print('Server started') 
while True: 
    try: 
     conn, addr = s.accept() 
    except socket.timeout: 
     pass 
    except Exception as exc: 
     print(str(exc)) 
     print('Server closing') 
     s.close() 
     break 
    except KeyboardInterrupt: 
     print('Server closing') 
     s.close() 
     break 
    else: 
     print('Connection from', addr) 

Aber die KeyboardInterrupt wird nie gefangen, weil es in den socket.timeout Exception-Handler passiert. Diese ist der Ausgang bei Drücken von Strg-C

c:\Users\JMatos\MEOCloud\Python>python file_server.py 
Server started 
Traceback (most recent call last): 
    File "file_server.py", line 40, in <module> 
    conn, addr = s.accept() 
    File "C:\Python35-32\lib\socket.py", line 195, in accept 
    fd, addr = self._accept() 
socket.timeout: timed out 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "file_server.py", line 40, in <module> 
    conn, addr = s.accept() 
KeyboardInterrupt 

Gibt es eine Möglichkeit, die KeyboardInterrupt Ausnahme innerhalb der socket.timeout Exception-Handler zu fangen?

Mein env ist Windows 7P + SP1 x64, Python 3.5.2 32b.

Vielen Dank im Voraus,

JM

Antwort

1

Das Problem ist nicht das Socket-Timeout. Das Problem ist, wo Sie erwarten, dass die Ausnahme ausgelöst wird. Ändern Sie den Code in:

try: 
    while True: 
     try: 
      conn, addr = s.accept() 
     except socket.timeout: 
      pass 
     except Exception as exc: 
      print(str(exc)) 
      print('Server closing') 
      s.close() 
      break 
    else: 
     print('Connection from', addr) 
except KeyboardInterrupt: 
    print('Server closing') 
    s.close() 
+0

Danke, das hat es getan. – jmatos

Verwandte Themen