네트워크, 서버

Socket Options

춤추는수달 2022. 4. 28. 05:15

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