Socket Option
카테고리: Server
인프런에 있는 루키스님의 게임 서버 강의를 듣고 정리한 내용입니다.
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;
댓글 남기기