본문 바로가기

분류대기

소켓 Linger 옵션

[1. 개요]

C++ 를 이용하여 서버 프로그램 작성 시, accept 된 소켓 (이하 클라이언트 소켓) 과 통신 시 발생한 문제

  • 서버: send() 후, 클라이언트 소켓에 대해서 close() 함
  • 클라이언트:  서버로 부터 응답을 받지 못하고, connection reset 이 발생
  • 서버: close() 전, shutdown() 을 이용해서 출력 스트림만 종료하여 출력 버퍼가 비워지도록 수정.
  • 클라이언트:  서버 응답 패킷 크기가 작은 경우는 응답을 받았지만, 패킷 크기가 큰 경우는 여전히 동일한 문제가 발생

위와 같은 문제의 원인은, 클라이언트 소켓을 대상으로 close() 한 것이 문제인데,

  • 보통 file descriptor (text 파일 같은 것) 를 대상으로 close() 를 호출하면 출력 버퍼가 비워진다고 알고 있었다.
  • 소켓도 동일할 거라 생각했는데, 소켓은 네트워크를 이용하여 통신을 하므로, 
  • 출력 버퍼를 비운다고 해서, 클라이언트로 모든 데이터를 보냈음을 보장 할 수 없다.

여기서 Linger 옵션은 소켓을 close() 했을 때, 남아있는 데이터를 어떻게 처리할 것인지 명세 할 수 있다.


[2. Linger 옵션]

struct linger
{
    int l_onoff;
    int l_linger;
}

 

변수 설명

  • l_onoff : Linger 옵션의 사용 여부 (1: 사용, 0: 미사용)
  • l_linger : close() 시 대기 시간 (초 단위)

l_onoff: 1 인 경우에 대해서

l_linger == 0 소켓 버퍼의 남아있는 데이터를 버림
l_linger  >  0 지정한 시간 동안 출력 버퍼가 비워질 때 까지 대기.
시간 초과 시 close() 가 실패(?)

[3. 적용]

해당 옵션에 대한 적용은 아래 함수를 이용한다.

  • setsockopt();

'분류대기' 카테고리의 다른 글