2017-04-15 30 views
1

비 차단 (settimeout 사용)을 허용하는 간단한 소켓 서버를 개발하려고하지만 Ctrl-C (KeyboardInterrupt)를 사용하여 중지 할 수 있기를 바랍니다.socket.timeout 예외 처리기에서 KeyboardInterrupt를 잡는 방법?

내 코드는 이것이다 :

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) 

을하지만이 socket.timeout 예외 핸들러 내부에서 발생하기 때문에 KeyboardInterrupt 잡힌되지 않습니다. 이 Ctrl-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 

을 눌러 출력은 socket.timeout 예외 핸들러 내부에 KeyboardInterrupt 예외를 잡을 수있는 방법이 무엇입니까?

내 env는 Windows 7P + SP1 x64, Python 3.5.2 32b입니다. 사전에

감사합니다,

답변

1

JM 문제는 소켓 제한 시간이 아니다. 문제는 예외가 발생할 것으로 예상되는 곳입니다. 코드를 다음으로 변경하십시오.

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

감사합니다. – jmatos