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 |