(C++ : IOCP-27) 소켓옵션

Posted by : at

Category : Cpp   iocp


setsockopt에 관한 설명, 모든걸 다 설명할 순 없고 MSDN을 참고하자

int setsockopt(
  SOCKET     s,         // 세팅할 소켓
  int        level,     // 1
  int        optname,   // 2
  const char *optval,   // 3
  int        optlen     // 4
);
// 1. level
// 옵션을 해석하고 처리할 주체
SOL_SOCKET      // 소켓 코드
IPPROTO_IP      // IPv4
IPPROTO_TCP     // TCP 프로토콜
// 2. 어떤옵션을 선택할 것인가? (매우 많기에 많이 쓰는거만 정리)
SO_KEEPALIVE    //  주기적으로 연결상태 확인

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

/* ************************ */

SO_LINGER       // send후 바로 closesocket을 한다면, send buf에 남아있는 데이터를 어떻게 처리할 것인가?

// Example
LINGER linger;
linger.l_onoff = 1;         // 바로 소켓을 닫지말고
linger.l_linger = 5;        // 5초대기
::setsocketopt(serverSocket, SOL_SOCKET, SO_LINGER, (char*)&linger sizeof(linger));

/* ************************ */

// (추가)
// Half-Close(shutdown) - 그냥 closesocket을 하지말고 closesocket전 특별한 처리를 해둔다
// SD_SEND : send를 막음
// SD_RECEIVE : recv를 막음
// SD_BOTH : send, recv모두 막음
::shutdown(serverSocker, SD_SEND);

/* ************************ */

SO_SNDBUF       // 송신 버퍼 크기
SO_REVBUF       // 수신 버퍼 크기

int32 sendBufferSize;
int32 optionLen;
::getsockopt(serverSocket, SOL_SOCKET, SD_SNDBUF, (char*)&sendBufferSize, &optionLen);

/* ************************ */

SO_REUSEADDR         // IP 및 PORT 재활용
// 내가 bind하려던 주소가 이전에 사용, 비정상 상황으로 점유중일경우 바로사용못하는 경우가 있음
// 바로사용하게 해달라는 명령
bool enable = true;
::setsocketopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&enable, sizeof(enable));

/* ************************ */

TCP_NODELAY     // Nagle 알고리즘 작동여부
// 데이터가 충분히 크면 보내고, 그렇지 않으면 데이터가 충분히 쌓일때까지 대기
// 장점 : 작은 패킷이 불필요하게 많이 생성되지 않음
// 단점 : 반응 시간 손해
// 게임은 보통 끈다

bool enable = true;
::setsocketopt(serverSocket, IPPROTO_TCP, TCP_NODELY, (char*)&enable, sizeof(enable));
// 보통 게임에선 send를 개발자가 원하는 만큼 쌓고 직접 send를보내지 Nagle알고리즘에 의존하지 않음.

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links