Socket Option이란
우리가 네트워크 통신을 위해 사용하는 Socket은 기본 사용법 대로만 하면 기본적인 통신하는 데에 문제가 없지만, Socket의 세부 옵션 설정을 통해 더 원하는 동작을 구현할 수 있다. 그것은 setsockopt 함수를 사용해서 가능하다.
또한 getsockopt 함수를 통해 현재 설정된 소켓의 옵션을 확인할 수도 있다.
setsockopt 함수의 기본 사용법
setsockopt 함수는 보통 다음과 같은 형태로 사용한다.
setsockopt(<소켓>, <설정 레벨>, <설정 할 옵션>, <설정 할 옵션의 값>, <설정 할 옵션의 값 변수의 크기>);
여기서 <설정 레벨> 이란 우리가 설정 할 주인공(?)의 레벨을 말한다. 예를 들면 우리가 설정 할 옵션이 소켓의 옵션인지, IPv4의 옵션인지, TPC 프로토콜의 옵션인지를 정하는 인자이다. 따라서 소켓의 옵션을 설정해주고 싶다면 SOL_SOCKET 을, TPC의 옵션을 설정하고 싶다면 IPPROTO_TCP를 넘겨주면 된다.
예시를 보자.
SOCKET serverSocket;
bool enable = true;
::setsockopt(serverSocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&enable, sizeof(enable));
위 예시 코드는 serverSocket에 해당하는 소켓의 SO_KEEPALIVE 옵션을 true로 설정한다는 뜻이다.
주요 옵션
setsockopt를 통해 설정할 수 있는 옵션들은 매우 많지만, 그 중 자주 쓸 것 같은 몇 가지 옵션만 살펴보자.
SO_KEEPALIVE : 주기적으로 소켓의 연결 상태를 확인할 것인지 여부 (TCP만 가능) 코드는 위 참조
SO_LINGER : 소켓이 닫혔을 때, 송신 버퍼에 남아있는 데이터를 전송할 지연시간을 줄 것인가, 아니면 그냥 바로 끝낼 것인가 여부
SOCKET serverSocket;
LINGER linger;
linger.l_onoff = 1; // 0이면 바로 종료, 1이면 지연시간 부여
linger.l_linger = 5; // 지연시간
::setsockopt(serverSocket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(linger));
SO_RCVBUF : 수신 버퍼 크기 , SO_SNDBUF : 송신 버퍼 크기
SOCKET serverSocket;
int32 recvBufferSize;
int32 optLen = sizeof(recvBufferSize);
::getsockopt(serverSocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&recvBufferSize, optLen);
cout <<"수신버퍼 크기 : " << recvBufferSize;
recvBufferSize += 1000;
optLen = sizeof(recvBufferSize);
::setsockopt(serverSocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&recvBufferSize, optLen);
SO_REUSEADDR : IP주소, 포트를 재사용할지 여부. 이미 사용중인 소켓을 사용하려고 할 경우 소켓을 열 수 없으므로 이런 경우 설정해줌.
SOCKET serverSocket;
bool enable = true;
::setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&enable, sizeof(enable));
TCP_NODELAY : Nable 알고리즘 작동 여부. 네이글 알고리즘은 데이터가 충분히 쌓일 때 까지 대기했다가 한 번에 보내도록 하는 알고리즘임.
SOCKET serverSocket;
bool enable = true;
::setsockopt(serverSocket, IPPROTO_TCP, TCP_NODELAY, (char*)&enable, sizeof(enable));
'네트워크, 서버' 카테고리의 다른 글
Overlapped 모델(콜백함수) (0) | 2022.04.30 |
---|---|
WSAEventSelect model (0) | 2022.04.29 |
Select model (0) | 2022.04.28 |
NAT(Network Address Translation) (0) | 2022.02.21 |
웹 서버 vs 게임 서버 (0) | 2022.01.23 |