2011-10-14 2 views
4

파이썬에서 소켓을 사용하는 방법을 배우고 있으며 프로그램이 중단되거나 Ctrl + C를 누르면 서버 소켓이 계속 포트에서 수신 대기합니다. 이렇게하면 프로그램이 다시 시작될 때 해당 포트에서 수신 대기하지 않게되므로 계속 변경해야합니다.종료/크래시시 서버 소켓 닫기

나는 어딘가에 socket.close()를 할 필요가 있다고 생각한다.

답변

7

atexit 모듈을 사용해보십시오. 문제가 테스트 기간 동안 사용할 수되는 포트 지연의 경우

import atexit 

function close_socket: 
    s.close() 

atexit.register(close_socket) 

, 나는 포트가 TCP 스택에 시간 제한 기다리는 것이 아니라, 즉시 다시 구속 할 수 SO_REUSEADDR을 설정하는 것이 좋습니다 것입니다.

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
1

프로그램을 종료하면 모든 소켓이 자동으로 닫힙니다. 그러나 TCP 포트는 그 이후에도 계속 사용됩니다. UNIX socket FAQ에는 섹션 2.7에 대한 설명이 있습니다.

테스트 목적으로, 임의의 포트를 요청하거나 (예 : 8000, 8001, 8002, ...와 같은 연속 포트를 요청하여) 해당 포트를 콘솔에 출력하는 것이 가장 좋습니다.