네트워크 상에서 서로의 소통 창고라고 보면됩니다.
소켓에 옵션을 설정하거나, 옵션을 가져오는 역할을 하는 함수입니다.
::setsockopt()
::getsockopt()
parameter
- Socket
- Level
- Socket레벨이면 SOL_SOCKET
- IP 레벨이면 IPPROTO_IP
- TCP 레벨이면 IPPROTO_TCP
- optname
SOL_SOCKET
- SO_KEEPALIVE (TCP only) : 주기적으로 연결 상태 확인 여부
- SO_LINGER : 연결을 지연하다. 송신 버퍼에 있는 데이터를 날릴것인가? 보낼것인가?
- SO_RCVBUF : 수신 버퍼에 사이즈(변경 및 확인 용)
- SO_SNDBUF : 송신 버퍼에 사이즈(변경 및 확인 용)
- SO_REUSEADDR : 갑자스러운 중단으로 다른 소켓이 IP와 Port를 점유중일 때 해당 IP Port를 강제로 가져올 수 있게 만다는 옵션
bool enabled = true;
::setsockopt(serverSocket, SOL_SOCKET, SO_KEEPALIVE, (char*)enabled, sizeof(enabled));
// onoff = 0이면 closesocket()이 바로 리턴, 아니면 linger초 만큼 대기(default 0)
LINGER linger;
linger.l_onoff = 1;
linger.l_linger = 5;
// 대기 시간
::setsockopt(serverSocket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(linger));
//::getsockopt();
// Half-close
// SD_SEND : send 막는다.
// SD_RECEIVE :recv 막는다.
// SD_BOTH : 둘 다 막는다.
// 나는 더 이상 할 애기 없다고 의사 표시를 하게됨
//::shutdown(serverSocket, SD_SEND);
// 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;
// SO_REUSEADDR
// 점유중인 IP 주소 나 PORT를 강제적으로 끊어 쓸 수 있게 만드는 방법
// IP주소 및 port 재사용
{
bool enabled = true;
::setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&enabled, sizeof(enabled));
}
// IPPROTO_TCP
// TCP_NODELAY = Nagle 알고리즘 작동 여부
// 데이터가 충분히 크면 보내고 좀 작다 싶다면 데이터가 충분히 쌓일 때까지 대기
// 장점 : 작은 패킷이 불필요하게 생성되는 일을 방지
// 단점 : 반응 시간의 손해를
{
// Nagle Algorithm on/off
bool enabled = true;
::setsockopt(serverSocket, IPPROTO_TCP, TCP_NODELAY, (char*)&enabled, sizeof(enabled));
}