2013-10-15 1 views
0

은 내 두 클래스 는 tcpserver를 중지하는 방법 TIME_WAIT 소켓을 제거하는 방법을

class RequestHandler(http.server.SimpleHTTPRequestHandler): 

class Server(socketserver.TCPServer): 

썼다 그래서 고유 서버는 일반 브라우저 -, 재활용 가능한 Ajax와 웹 소켓 요청을 처리 할 수있다. 잘 작동합니다.

서버를 종료하는 방법을 찾지 못했습니다. 그래서 나는 그 과정을 죽인다.

[편집] 브라우저에서 종료 요청을 받으면 서버를 종료해야합니다. self.__shutdown_request 설정을 시도했지만 작동하지 않았습니다.

브라우저를 종료하고 프로세스를 종료 한 후에도 TIME_WAIT 상태의 서버 포트를 사용하여 여전히의 소켓이 있음을 알 수 있습니다. 그래서 같은 포트를 다시 사용하기 전에 그들이 죽을 때까지 기다려야합니다.

서버를 어떻게 종료합니까?

이러한 소켓을 제거 할 수있는 방법이 있습니까?

+0

첫 번째 문제에 도움을 줄 수는 없지만 TIME_WAIT 상태에서 소켓이 멈추는 것을 방지하려면 SO_LINGER를 0으로 설정하고 여기에 표시된 것처럼 설정할 수 있습니다. http://stackoverflow.com/questions/6439790/sending- a-reset-in-tcp-ip-socket-connection – fvu

+0

@fvu 작동합니다. 감사. – donkeydown

답변

3

Server.shutdown 메서드를 사용해 서버를 종료 할 수 있습니다. 파이썬 문서에서 설명했듯이이 메서드는 Server.serve_forever 루프가 멈출 때까지 기다렸다가 멈출 때까지 기다립니다. 그런데 SO_LINGER를 ON으로 설정하여 TCP 소켓의 TIME_WAIT 상태를 피할 수는 있지만 그렇게하는 것은 바람직하지 않습니다. 또 다른 방법은 서버 포트를 바인드하기 전에 SO_REUSEADDR을 설정하는 것입니다.

+0

나는 이미 시도했고'self .__ shutdown_request'를 True로 설정했습니다. – donkeydown