[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();
'분류대기' 카테고리의 다른 글
Segmentation fault 해결 (C++) (0) | 2025.03.04 |
---|---|
윈도우 컴파일 에러. [No Target Architecture] (0) | 2025.03.04 |
[인코딩] EUCKR (0) | 2025.02.04 |
[인코딩] UTF-8 (0) | 2025.01.23 |
[리눅스] goto 사용 시 컴파일 (0) | 2025.01.14 |