Today I Learn

[TIL][C++] 250424 MMO 서버 개발 4일차: NetAddress 추가, union 키워드, WSASOCKET()과 socket()의 차이, ntoh, hton , ntop, pton

pledge24 2025. 4. 25. 00:30
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 

NetAddress

  • 보다 직관적으로 IP 주소와 port를 저장하고 사용하기 위한 클래스.

union 키워드

  • union 키워드는 여러 변수가 같은 메모리 공간을 공유하는 데이터 구조로, union 키워드를 사용하면 같은 메모리를 다양한 크기의 변수들로 표현할 수 있다.

union 키워드 예제: IN_ADDR

typedef struct in_addr {
        union {
                struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;
                struct { USHORT s_w1,s_w1; } S_un_w;
                ULONG S_addr;
        } S_un;
#define s_addr  S_un.S_addr /* can be used for most tcp & ip code */
#define s_host  S_un.S_un_b.s_b2    // host on imp
#define s_net   S_un.S_un_b.s_b1    // network
#define s_imp   S_un.S_un_w.s_w2    // imp
#define s_impno S_un.S_un_b.s_b4    // imp #
#define s_lh    S_un.S_un_b.s_b3    // logical host
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
  • in_addr이라는 이름의 구조체는 S_un이라는 이름을 가진 union이 있으며, S_un은 S_un_b, S_un_w, S_addr와 같이 표현할 수 있다. 그림으로 표현하자면 아래와 같다.
// in_addr 구조체는 S_un이라는 union을 가졌다.(4바이트)
// S_un
[s_b1][s_b2][s_b3][s_b4] // S_un.S_un_b
[===s_w1===][===s_w1===] // S_un.S_un_w
[========S_addr========] // S_un.S_addr

WSASOCKET()과 socket()의 차이

  • WSASOCKET()은 Window전용 함수이며, socket()은 Linux, Unix등 여러 OS에서 사용하기 위한 표준 소켓 API 함수이다.
  • Window 환경에서 WSASOCKET()을 사용하면, 보다 많은 매개변수들을 통해, 확장된 기능을 사용할 수 있다.
    • 소켓 그룹, 소켓 속성, 플래그 등의 추가 매개변수를 통해 더 세밀한 제어가 가능하다.

이 둘의 차이 예제

SOCKET socket1 = ::socket(AF_INET, SOCK_STREAM, 0);
SOCKET socket2 = ::WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);

ntoh, hton

  • ntoh는 network to host의 약자로, 네트워크 바이트 순서를 호스트 바이트 순서로 변환한다.
  • 반대로, hton은 host to network의 약자로, 호스트 바이트 순서를 네트워크 바이트 순서로 변환한다.
  • 이 함수들은 리틀 엔디안, 빅 엔디안과 관련되며, 엔디안 방식을 일치시키기 위해 사용한다.
  • 뒤에 s나 l가 붙는데, 이는 short, long을 의미하며, 변환한 타입을 설정한다.
// 포트 번호 변환
uint16_t port = 8080;
uint16_t net_port = htons(port);

// IP 주소 변환
uint32_t ip = 0xC0A80101;  // 192.168.1.1
uint32_t net_ip = htonl(ip);

ntop, pton

  • ntop는 network to presentation의 약자로, 네트워크 바이트 순서를 사람이 읽기 쉬운 텍스트 표현으로 변환한다.
  • 반대로, pton은 presentation to network 의 약자로, 사람이 읽기 쉬운 텍스트 표현을 네트워크 바이트 순서로 변환한다.
  • 뒤에 w가 붙기도 하는데, 이는 wide의 약자로 반환 타입이 wchar으로 된다.