2017-05-08 2 views
0

백그라운드에서 실행되는 서버 프로세스가 제어 프로그램에 의해 제어되는 시스템이 있습니다.TIME_WAIT 및 EADDRINUSE on Linux

제어 프로그램은 하나의 명령을 수행 한 다음 종료하는 간단한 스크립트입니다. 실행 명령의 경우 새 서버 프로세스를 만듭니다. 나머지 (셧다운 포함) 명령은 예약 된 제어 포트를 통해 서버에 명령을 보냅니다.

제어 프로그램은 소켓을 생성하고 서버의 제어 포트에 연결하며 데이터의 한 문자 (명령)를 전송하고 소켓에서 응답을 읽고 소켓을 닫은 다음 사용자에게 응답을 표시하고 종료합니다. 서버는 제어 소켓에서 연결을 허용하고, 데이터 문자를 읽고, 응답을 보내고, 하위 소켓을 닫고 계속 청취합니다. 서버가 종료되면 상위 제어 소켓도 닫힙니다.

이 기능은 Windows XP/Python 2.6.6에서 수년간 작업 해 왔습니다. 최근 우리는 리눅스 (Ubuntu 16.04.2 GNU/Linux 4.4.0-62- 일반 x86_64/Python 2.7.12) 로의 포팅을 시도했지만 Restart 명령 (Shutdown 바로 다음에 Run)이 실패합니다 : 새로운 서버 프로세스가 시도 할 때 제어 소켓에 제어 소켓을 바인드하려면 EADDRINUSE를 가져옵니다.

netstat의 출력은 Shutdown 명령에 사용 된 연결이 TIME_WAIT 상태로 유지되고 약 2 분 동안 계속됨을 나타냅니다.

이 주제에 대한 이전 게시물을 검토했습니다. 서버의 제어 소켓에서 SO_REUSEADDR 및/또는 SO_REUSEPORT를 설정하려고했습니다. 나는 제어 프로그램이 연결의 측면을 먼저 닫도록 보장하기 위해 서버와 제어 프로그램 사이의 프로토콜을 향상 시키려고 시도했지만 지금까지는 작동하는 조합을 찾지 못했습니다. 나는 해결책이 있는지 궁금해.

서버와 제어 프로그램이 동일한 시스템에서 실행되는 경우, 연결의 양 측면에 대한 세부 사항이 운영 체제의 상태 테이블에 있고 TIME_WAIT에 나머지 하나가 있어야합니다.

제어 프로그램에 대한 항목으로 인해 서버가 포트에 바인딩되지 않습니까?

Windows에서도 TIME_WAIT 상태가 유지되지만 새 서버 프로세스가 동일한 제어 포트에 바인딩되는 것을 방지하지는 않습니다.

+0

안녕하세요, StackOverflow에 오신 것을 환영합니다! 일부 서식을 포함하도록 질문을 편집 할 수 있습니다. 바로 지금, 읽는 것은 매우 어렵습니다! –

답변

0

나는 내 자신의 질문에 대답했다. 원하는 동작을 얻으려면 SO_REUSEADDR (전용) 서버의 제어 소켓 (전용) 설정해야합니다. SO_REUSEPORT를 사용할 필요는 없습니다. 제어 프로그램에 대해 아무 것도 할 필요가 없습니다. 어느 쪽이 연결을 먼저 닫을지는 아무런 차이가 없습니다.

어리석은 실수로 첫 시도가 작동하지 않았습니다. (나는 잘못된 변수를 사용했습니다.)