Socket Option

Date:     Updated:

카테고리:

태그:

인프런에 있는 루키스님의 게임 서버 강의를 듣고 정리한 내용입니다.


Set Socket Option

int WSAAPI setsockopt(
  [in] SOCKET     s,
  [in] int        level,
  [in] int        optname,
  [in] const char *optval,
  [in] int        optlen
);
  • level : 옵션을 처리할 주체
    • SOL_SOCKET : 소켓
    • IPPROTO_IP : IPv4
    • IPPROTO_TCP : TCP 프로토콜


SO_KEEPALIVE

연결 상태를 주기적으로 체크 (TCP Only)

bool enable = true;
::setsockopt(serverSocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&enable, sizeof(enable));


SO_LINGER

연결을 끊을 때 버퍼에 남아있는 데이터 처리 여부

// onoff = 0 이면 closesocket() 이 바로 리턴. 아니면 linger 초만큼 대기 (default 0)
// linger : 지연 시간
LINGER linger;
linger.l_onoff = 1;
linger.l_linger = 5;
::setsockopt(serverSocket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(linger));
  • 통신을 하다 갑자기 closesocket 함수를 호출한다면 아직 버퍼에 데이터가 남아있을 가능성이 큼
  • SO_LINGER 옵션을 적용하면 close 전 대기 시간을 추가해 남아있는 버퍼를 처리할 수 있음


SO_REUSEADDR

IP주소 및 포트 재사용

::setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&enable, sizeof(enable));

디버깅을 한다거나 프로그램을 개발할 때 등 비정상적으로 연결이 끊기면 다시 실행할 때 bind가 실패할 수 있다. 이런 경우 재 연결을 하려면 충분한 시간이 흐른 뒤에 다시 시도하던가, 포트를 바꿔야 하는 등의 처리가 필요한데 이런 경우 (bind가 실패한다면) SO_REUSEADDR 옵션을 이용하면 간단하게 재연결 할 수 있다.


TCP_NODELAY

bool enable = true;
::setsockopt(serverSocket, IPPROTO_TCP, TCP_NODELAY, (char*)&enable, sizeof(enable));
  • level : IPPROTO_TCP
  • true로 옵션을 키면 패킷이 들어올 때마다 바로바로 보내지 않고, 버퍼에 충분한 데이터가 쌓일 때까지 대기 후 한 번에 전송
  • 작은 패킷을 많이 생성하지 않아 효율적이지만 반응 시간에 손해가 있으므로 게임에서는 사용하지 않는 편


Get Socket Option

// SO_SNDBUF = 송신 버퍼 크기
// SO_RCVBUF = 수신 버퍼 크기

int32 sendBufferSize;
int32 optionLen = sizeof(sendBufferSize);
::getsockopt(serverSocket, SOL_SOCKET, SO_SNDBUF, (char*)&sendBufferSize, &optionLen);
cout << "송신 버퍼 크기 : " << sendBufferSize << endl;

int32 recvBufferSize;
optionLen = sizeof(recvBufferSize);
::getsockopt(serverSocket, SOL_SOCKET, SO_SNDBUF, (char*)&recvBufferSize, &optionLen);
cout << "수신 버퍼 크기 : " << recvBufferSize << endl;



맨 위로 이동하기

Server 카테고리 내 다른 글 보러가기

댓글 남기기