본문 바로가기

컴퓨터/C

C 네트워크 주소 정보의 표현

I. sockaddr_in

struct sockaddr_in {
  sa_family_t sin_family; //주소체계(Address Family)
  unit16_t sin_port; //16비트 TCP/UDP PORT 번호
  struct in_addr sin_addr; //32비트 IP주소. 아래 구조체 참고
  char sin_zero[8]; //사용되지 않음
};

struct in_addr {
  in_addr_t s_addr; //32비트 IPv4 인터넷 주소
};

1. sin_family

주소체계(Address Family) 의미
AF_INET IPv4 인터넷 프로토콜에 적용하는 주소체계
AF_INET6 IPv6 인터넷 프로토콜에 적용하는 주소체계
AF_LOCAL 로컬 통신을 위한 유닉스 프로토콜의 주소체계

2. sin_port

16비트 PORT번호를 네트워크 바이트 순서로 저장한다.

3. sin_addr

32비트 IP주소정보를 네트워크 바이트 순서로 저장한다. 

4. sin_zero

특별한 의미를 지니지 않는 멤버이다. 단순히 구조체 sockaddr_in의 크기를 구조체 sockaddr와 일치시키기 위해 삽입된 멤버이다. 반드시 0으로 채워야 한다.

II. 네트워크 바이트 순서

1. CPU의 데이터 저장 방식 Host Byte Order 호스트 바이트 순서

방식 의미 예: 정수 0x12345678 저장
0x20번지 0x21번지 0x22번지 0x23번지
빅 엔디안 Big Endian 상위 바이트의 값을 작은 번지수에 저장하는 방식 0x12 0x34 0x56 0x78
리틀 엔디안 Little Endian 상위 바이트의 값을 큰 번지수에 저장하는 방식 0x78 0x56 0x34 0x12

네트워크 바이트 순서는 빅 엔디안 방식으로 통일한다!

2. 바이트 순서의 변환 Endian conversions

함수 의미 용도
unsigned short htons(unsigned short) short형 데이터를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환 PORT 번호 변환
unsigned short ntohs(unsigned short) short형 데이터를 네트워크 바이트 순서에서 호스트 바이트 순서로 변환 PORT 번호 변환
unsigned long htonl(unsigned long) long형 데이터를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환 IP 주소 변환
unsigned long ntohl(unsigned long) long형 데이터를 네트워크 바이트 순서에서 호스트 바이트 순서로 변환 IP 주소 변환

III. 인터넷 주소의 초기화와 할당

1. 문자열정보를 네트워크 바이트 순서의 정수로 변환

#include <arpa/inet.h>

in_addr_t inet_addr(const char* string);

성공 시 빅 엔디안으로 반환된 32비트 정수 값, 실패 시 INADDR_NONE 반환

점이 찍힌 십진수 표현방식 Dotted Decimal Notation에서 32비트 정수형으로 변환해준다. 변환 과정에서 네트워크 바이트 순서로의 변환도 동시에 진행한다.

2. 인터넷 주소의 초기화

  1 char* serv_port="3000"; //PORT번호 문자열 선언
  2 struct sockaddr_in addr;
  3 memset(&addr, 0, sizeof(addr));//구조체 변수 addr의 모든 멤버 0으로 초기화
  4 addr.sin_family=AF_INET;//주소체계 지정
  5 addr.sin_addr.s_addr=htonl(INADDR_ANY);//IP주소 초기화.
  6 addr.sin_port=htons(atoi(serv_port));//문자열 기반의 PORT번호 초기화

INADDR_ANY는 소켓이 동작하는 컴퓨터의 IP주소가 자동으로 할당된다.

'컴퓨터 > C' 카테고리의 다른 글

C accept()  (0) 2022.11.05
C listen()  (0) 2022.11.05
C bind()  (0) 2022.11.04
C socket()  (0) 2022.11.03
C soket 소켓 생성 과정  (0) 2022.11.03