소켓 옵션

1. 주소 체계

int socket(int af, int type, int protocol);

af에 지정하는 주소체계

 

 

1.1. 옵션

IPv4 (AF_INET)

  - 32비트 주소 체계

  - sockaddr_in 구조체 사용

 

IPv6 (AF_INET6)

  - 128비트 주소 체계

  - sockaddr_in6 구조체 사용

 

 

1.2. 바이트 순서

변환 함수:

htons() : 호스트에서 네트워크 순서로 (short)
htonl()  : 호스트에서 네트워크 순서로 (long)
ntohs()  : 네트워크에서 호스트 순서로 (short)
ntohl()  : 네트워크에서 호스트 순서로 (long)

 

 

2. 소켓 종류

int socket(int af, int type, int protocol);

type에 지정하는 소켓의 종류

 

 

2.1. 옵션

스트림 소켓(SOCK_STREAM) : TCP 프로토콜 사용, 신뢰성 있는 데이터 전송
데이터그램 소켓(SOCK_DGRAM) : UDP 프로토콜 사용, 비연결형 통신
로우 소켓(SOCK_RAW) : 하위 계층 프로토콜에 직접 접근

 

 

3. setsockopt()와 getsockopt()

 

기본 함수 원형

int setsockopt(
    SOCKET s,             // 사용할 소켓
    int level,            // 옵션을 해석하고 처리할 주체(소켓, IPv4, TCP프로토콜 등)
    int optname,          // 적용할 옵션 이름
    const char* optval,   // 옵션에 적용될 값
    int optlen            // 옵션 값의 크기
);

int getsockopt(
    SOCKET s,
    int level,
    int optname,
    char* optval,
    int* optlen 
);



4. 주요 소켓 옵션

4.1.소켓 옵션을 지정할 level

SOL_SOCKET	 //일반적인 소켓 옵션
IPPROTO_TCP	 //TCP 프로토콜 관련 옵션
IPPROTO_IP	 //IP 프로토콜 관련 옵션

 

 

4.2.주요 소켓 옵션

// 소켓 레벨 옵션 (SOL_SOCKET)

SO_REUSEADDR    // IP주소 및 port 재사용 (보통은 켜두는게 개발단계에서 편함)
SO_KEEPALIVE    // 주기적으로 연결 상태 확인 여부(TCP Only)
SO_RCVBUF       // 수신 버퍼 크기
SO_SNDBUF       // 송신 버퍼 크기
SO_LINGER       // 연결이 끊길 때 송신 버퍼에 있는 데이터를 보낼지 여부
SO_RCVTIMEO     // 수신 타임아웃
SO_SNDTIMEO     // 송신 타임아웃


// TCP 레벨 옵션 (IPPROTO_TCP)
TCP_NODELAY     // *Nagle 알고리즘 비활성화
TCP_KEEPCNT     // Keepalive 프로브 횟수
TCP_KEEPIDLE    // Keepalive 시작 전 대기 시간
TCP_KEEPINTVL   // Keepalive 프로브 간격

 

* Nagle 알고리즘

데이터가 충분히 크면 전송하고, 그렇지 않으면 데이터가 충분히 쌓일때까지 대기

회선 낭비를 줄이고 효율적으로 전송하기 위함

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

단점 : 대기시간이 생겨 반응시간 손해

MMO Server에서는 반응시간이 더 중요해 보통 꺼놓고 사용

ex)

{
    bool enable = true;   // 주소 재사용 설정
    ::setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&enable, sizeof(enable));
}

{
    bool enable = true;   // 연결 상태 확인 설정
    ::setsockopt(serverSocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&enable, sizeof(enable));
}

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

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

{
    LINGER linger;        // 연결이 끊기면 5초간 대기 후 송신버퍼에 있는 데이터를 전송
    linger.l_onoff = 1;
    linger.l_linger = 5;
    ::setsockopt(serverSocket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(linger));
}

{
    bool enable = true;   // Nagle 알고리즘 사용안함
    ::setsockopt(serverSocket, IPPROTO_TCP, TCP_NODELAY, (char*)&enable, sizeof(enable));
}

'학습 > C++ 소켓 프로그래밍' 카테고리의 다른 글

Overlapped I/O  (0) 2025.03.30
Non-Blocking 소켓  (0) 2024.11.09
UDP 소켓 프로그래밍  (0) 2024.10.31
TCP 소켓 프로그래밍  (0) 2024.10.31
소켓 프로그래밍  (0) 2024.10.29