Computer Science 기본 지식/소켓 프로그래밍

[TCP/IP 소켓 프로그래밍] 소켓 옵션 LINGER

로파이 2021. 8. 20. 18:35

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));

 

-- 참고

http://egloos.zum.com/rucaus/v/2372401