setsockopt 함수를 통해 소켓 옵션을 설정할 수 있는데, 그 중 SO_LINGER 옵션을 사용하는 소켓에 대해 알아본다.
LINGER 라는 구조체로 옵션을 설정한다.
struct linger {
u_short l_onoff; /* option on/off */
u_short l_linger; /* linger time */
};
l_onoff : 0보다 큰 수로 설정하면 기존 TCP의 4-way handshaking 정책에 따른 우아한 종료를 실행한다.
l_linger : 우아한 종료가 끝날때까지 기다리는 시간을 의미한다. 소켓의 Close이후 소켓의 완전 종료 처리는 커널단에서 진행되며, 블로킹 소켓이라면 블락 상태에서 해당 시간동안 대기하고 논블로킹 소켓의 경우 해당 시간동안 E_WOULDBLOCK을 반환하며 사용자 프로세스에서 다른 작업을 할 수 있다. 만약 주어진 시간동안 우아한 종료 과정이 끝나지 않을 경우 송신 버퍼에 남아있는 데이터를 버리고 RST 플래그를 담아 패킷을 보내고 강제로 모든 과정을 끝내고 커널단에서 소켓을 완전 종료시킨다.
이로써 마지막 ACK를 보낸뒤 잘 도착할 때까지 대기하는 시간 TIME_WAIT 단계를 생략시킬 수 있다.
-- 대기시간 없이 바로 종료
LINGER Linger;
Linger.l_onoff = 1;
Linger.l_linger = 0;
setsockopt(mSocket, SOL_SOCKET, SO_LINGER, (char*) &Linger, sizeof(LINGER));
-- 참고
'Computer Science 기본 지식 > 소켓 프로그래밍' 카테고리의 다른 글
논블로킹 소켓 WSA 함수 (TCP / UDP) (0) | 2021.08.21 |
---|---|
[TCP/IP 소켓 프로그래밍] WSACreateEvent()와 WSAEventSelect() (0) | 2021.08.21 |
[게임 서버 프로그래밍 교과서] IOCP 서버 (0) | 2021.08.19 |
[게임 서버 프로그래밍 교과서] Poll을 이용한 논블로킹 서버 (0) | 2021.08.19 |
[게임 서버 프로그래밍 교과서] 블로킹 소켓 ManyClient - ManyServer 구조 (0) | 2021.08.19 |