Server/C++

Socket option

Juzdalua 2024. 8. 6. 23:17
소켓코드 -> SOL_SOCKET // 옵션을 해석하고 처리할 주체
IPv4 -> IPPROTO_IP
TCP 프로토콜 -> IPPROTO_TCP
setsockopt();
getsockopt();
/*
	Half-Close
    SD_SEND: send 막는다.
    SD_RECEIVE: recv 막는다.
    SD_BOTH: 둘다 막는다.
*/

shutdown(serverSocket, SD_SEND);

// 소켓 리소스 반환
closesocket(serverSocket);

SO_KEEPALIVE

SO_KEEPALIVE // 주기적으로 연결 상태 확인 여부 (TCP Only)
bool enable = true;
setsockopt(serverSocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&enable, sizeof(enable));

SO_LINGER

커널레벨에 존재하는 Send Buffer에 데이터를 저장하고 send함수로 데이터를 송신한다.

송신이 완료되기 전, closesocket() 함수로 소켓 리소스를 반환하면 송신이 완료되지 않은 Send Buffer를 통제할 때 사용한다.

SO_LINGER // 대기시간. 송신 버퍼에 있는 데이터를 보낼 것인가? 날릴 것인가?
// -> on/off => 0이면 closesocket()이 바로 리턴 / 1이면 linger초만큼 대기 (default 0)
LINGER linger;
linger.l_onoff = 1;
linger.l_linger = 5;

setsockopt(serverSocket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(linger));

SO_SNDBUF / SO_RCVBUF

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

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

SO_RESUEADDR

SO_RESUEADDR //IP주소, PORT 재사용
// 사용중인 주소를 재사용할 때 사용
bool enable = true;
setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&enable, sizeof(enable));

TCP_NODELAY

장점: 작은 패킷이 불필요하게 많이 생성되는 일을 방지

단점: 반응 시간 손해

IPPROTO_TCP
TCP_NODELAY // Nagle 알고리즘 작동 여부
// 데이터가 충분히 크면 보내고, 그렇지 않으면 데이터가 충분히 쌓일때까지 대기한다.
// 데이터를 효율적으로 보내겠다.
// true -> Nagle 사용X / false -> Nagle 사용O
bool enable = true;
setsockopt(serverSocket, IPPROTO_TCP, TCP_NODELAY, (char*)&enable, sizeof(enable));

https://learn.microsoft.com/ko-kr/windows/win32/api/winsock2/nf-winsock2-setsockopt

 

setsockopt 함수(winsock2.h) - Win32 apps

setsockopt 함수(winsock2.h)는 모든 형식의 소켓과 연결된 소켓 옵션의 현재 값을 모든 상태로 설정합니다.

learn.microsoft.com

 

'Server > C++' 카테고리의 다른 글

Select 모델  (0) 2024.08.07
논블로킹 소켓 (Non-Blocking Socket)  (0) 2024.08.07
UDP 소켓 프로그래밍  (0) 2024.08.06
TCP vs UDP  (0) 2024.08.06
TCP 소켓 프로그래밍  (0) 2024.08.06