python 멀티쓰레딩 환경에서 socket, select, makefile

이글을 쓰게 된 이유는 아래와 같다.

  • python 으로 짜여진 코드를 수정해서 사용해야 한다.
  • Multi Threading 환경으로 구성되어 있다.
  • 기존 코드를 최대한 유지하는 방향으로 작성한다.
  • 사용된 라이브러리는 socket, select 이며,
    makefile 로 socket을 file descriptor 로 변경하여 readline을 사용한다.

여기서 문제가 되었던 기능은

  1. [C] 사용자가 socket으로 특정 쓰레드 생성 명령어 수행
  2. [S] 쓰레드 생성 및 실행
  3. [C] 사용자 접속 종료

으로 심플한 기능이다. 단순히 쓰레드를 실행하는 것일 뿐인데 문제가 되는 부분은 3이었다. 분명 서버단에서 close를 호출하여 file descriptor 를 닫아주었고, socket도 따로 close 했음에도 불구하고 클라이언트는 끊어지지 않은 것으로 판단, 계속해서 동작하는 문제였다. ( 사실 동작은 아니다. 그저 끊어지지 않았을 뿐 )

그래서 구글링한 결과를 정리하자면 먼저 소켓을 shutdown 시키면 되다는 것을 알게 되었다.

sock.shutdown(socket.SHUT_WR)

위와 같이 써준 후 socket을 close 하면 정상 동작한다.

답글 남기기

이메일은 공개되지 않습니다.