🔖SOCKADDR VS SOCKADDR_IN

🏠 주소 정보

1. 프로토콜(IPv4, IPv6)
2. IP 주소
3. 포트 번호

주소를 저장하기 위한 2가지의 구조체가 있다.

SOCKADDR_IN 구조체:
개발자는 SOCKADDR_IN 구조체를 사용해 주소 정보 저장
SOCKADDR 구조체: 소켓에 주소 정보를 연결할 땐 SOCKADDR 구조체로 변환하여 사용

SOCKADDR 구조체는 사람이 사용하기에 불편한 형식이라 사용하기 편한 SOCKADDR_IN 구조체로 주소 저장

 

주소 정보를 등록하는 순서

1. sockaddr_in 구조체를 모두 0으로 초기화 ➡️ 0으로 초기화 시키지 않을 경우 sockaddr 구조체 변환할 때 오류

2. sockaddr_in 구조체 멤버에 값들을 저장
3. sockaddr_in 구조체를 sockaddr 구조체로 변환

 

SOCKADDR_IN 구조체

- 주소 정보를 입력할 때 사용

* SOCKADDR_IN 구조체로 주소 정보를 저장할 때 멤버 변수를 모두 0으로 초기화해야 한다.

struct sockaddr_in {
 sin_family_t   sin_family;
 in_port_t      sin_port;
 
 struct in_addr sin_addr;
}

struct in_addr {
 unit32_t s_addr;
};

 

1) sa_family

프로토콜(IPv4, IPv6)

 

2) sin_port

포트번호

 

3) sin_addr > in_addr

IP 주소

 

sin_addr는 구조체로 멤버 변수인 in_addr 구조체의 s_addr에 저장해야 한다.

s_addr는 정수형이다.

문자열 IP를 네트워크 바이트로 변환해야 한다.

지정한 IP 주소가 있다면 inet_addr, inet_network, inet_aton, inet_pton 함수 중 선택하여 변환한다.

그러나 IP 주소를 지정하기가 귀찮다면 IP를 자동 할당시킬 수 있다.

serv_addr.sin_addr.s_addr = htonl(INADDR_ANY)  ➡️ IP 자동 할당

 

 


SOCKADDR 구조체

-  소켓에 주소 정보를 등록할 때는 sockaddr 구조체 사용하여 bind() 함수에 주소 정보 전달

struct sockaddr {
  sa_family_t sa_family;
  char 	      sa_data[14];
}

 

1) sa_family

주소 체계를 나타내는 16비트 정수 값

프로토콜(IPv4, IPv6)

 

2) sa_data

주소 체계에서 사용할 주소 정보

IP 주소, Port 번호

 

 

IP 주소(4바이트)

127 0 0 1

Port 번호(2바이트)

80 80

 

남는 바이트(10바이트)
➡️ IP와 Port 정보가 더해서 6바이트밖에 안되는데 10바이트가 남는다. ➡️  0으로 무조건 채운다 ➡️  0으로 안 채우면 에러

0 0 0 0 0 0 0 0 0 0