티스토리 뷰
Socket 옵션 설정하기
TIME-WAIT 상태가 길어지거나 네트워크가의 상태가 원활하지 못하다면 언제까지 TIME-WAIT 상태가 지속될지 모른다. TIME-WAIT 상태일 때 해당 주소와 포트로 바인딩을 시도한다면 프로그램은 오류를 내뱉을 것이다. 이를 해결하기 위해 소켓 옵션을 이용하여 바인딩된 TIME-WAIT 상태인 주소와 포트를 재할당 및 재사용하도록 설정할 수 있다.
다음과 같이 SO_REUSEADDR 옵션을 설정하여 바인딩된 TIME-WAIT 상태인 주소와 포트를 재사용할 수 있다.
int reuseOpt = 1;
setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuseOpt, sizeof(reuseOpt));
SO_REUSEADDR 옵션 적용됨: 1
SO_REUSEADDR 옵션 적용안됨: 0
클라이언트 소켓 옵션은 설정할 필요가 있을까 ?
클라이언트가 연결될 때 무작위 포트가 활성화 되어 연결되기 때문에 설정할 필요가 없다고 볼 수 있다. 하지만 서버는 클라이언트와 연결 될 때 특정 포트로 연결되기 때문에 바인딩할 때 실패할 위험이 존재한다. 즉, 클라이언트에 할당된 포트는 유동적이고 서버의 포트는 고정된 것이라 볼 수 있다. 그러므로 SO_REUSEADDR 소켓 옵션은 서버에게 설정하는 것이 바람직하다.
댓글