VisualStudio/C++서버

[C++] setsockopt와 Socket 설정

usingsystem 2024. 5. 23. 14:39
728x90

1. SO_KEEPALIVE (Keep-Alive 설정)

bool enable = true;
::setsockopt(serverSocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&enable, sizeof(enable));
  • 목적: 주기적으로 연결 상태를 확인합니다.
  • 설명: TCP 연결이 유효한지 주기적으로 확인합니다. 상대방이 갑작스럽게 연결을 끊어도 TCP 프로토콜을 통해 연결 상태를 확인할 수 있습니다.

2. SO_LINGER (지연 닫기 설정)

LINGER linger;
linger.l_onoff = 1;
linger.l_linger = 5;
::setsockopt(serverSocket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(linger));
  • 목적: 소켓이 닫힐 때 송신 버퍼에 남아있는 데이터를 어떻게 처리할지 설정합니다.
  • 설명: l_onoff가 1인 경우, 소켓을 닫을 때 송신 버퍼에 데이터가 남아있으면 l_linger 시간 동안 대기합니다. 그 후에는 데이터를 보내거나 손실합니다.

3. 소켓 닫기 

::shutdown(serverSocket, SD_SEND);
::closesocket(serverSocket);
  • 목적: 소켓을 닫고 소켓 리소스를 반환합니다.
  • 설명: shutdown으로 소켓을 닫으면 더 이상 데이터를 보낼 수 없게 됩니다. 이후 closesocket을 호출하여 소켓 리소스를 반환합니다.

4. 송신/수신 버퍼 크기 확인

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_RCVBUF, (char*)&recvBufferSize, &optionLen);
cout << "수신 버퍼 크기 : " << recvBufferSize << endl;
  • 목적: 송신 버퍼와 수신 버퍼의 크기를 확인합니다.
  • 설명: getsockopt 함수를 사용하여 소켓의 송신 버퍼와 수신 버퍼의 크기를 가져옵니다.

5. SO_REUSEADDR (주소 재사용 설정)

bool enable = true;
::setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&enable, sizeof(enable));
  • 목적: IP 주소와 포트를 재사용합니다.
  • 설명: 서버가 다시 시작될 때 이전에 사용한 IP 주소와 포트 번호를 즉시 재사용할 수 있도록 설정합니다.

6. TCP_NODELAY (네이글 알고리즘 끄기) 

bool enable = true;
::setsockopt(serverSocket, IPPROTO_TCP, TCP_NODELAY, (char*)&enable, sizeof(enable));
  • 목적: Nagle 알고리즘을 비활성화하여 지연을 최소화합니다.
  • 설명: 작은 패킷이 많이 생성되는 것을 방지하여 데이터 전송을 최적화합니다.

Nagle 알고리즘 

  • 작은 데이터의 전송량을 줄여 네트워크 지연을 최소화합니다. 데이터를 충분히 모아서 데이터크기가 커지면 보낸다. 작은 패킷이 불필요하게 많이 생성되는 일을 방지할 수 있다.
  • 즉실시간 통신에는 적합하지 않습니다. 작은 데이터의 지연이 발생할 수 있어 실시간 통신에서는 부적합할 수 있습니다.
728x90