[Computer Network] 주소정보의 표현

G·2023년 3월 15일
0

Socket Programming

목록 보기
4/6
post-thumbnail

(인터넷 주소란 인터넷 상에서 컴퓨터를 구분하는 목적으로 사용되는 주소이다.
4byte 주소체계인 IPv4와 16byte 주소체계인 IPv6가 존재한다.)

주소체계

struct sockaddr_in serv_addr;

if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == 1)
	error_handling("bind() error")

첫 번째 인자(소켓)에 IP주소와 포트번호를 부여하는데 그게 두 번째 인자의 구조체이다.

위 코드의 구조체는 다음과 같다.

struct sockaddr_in{
	sa_family_t sin_family; //IP 버전
	uint16_t sin_port;      //포트 번호
    struct in_addr sin_addr;//32비트 IP주소
    char sin_zero[8];       //사용x
}

자료형

sa_family_t: 주소체계
socketlen_t: 길이정보
in_addr_t: IP주소정보, uint32_t로 정의
in_port_t: PORT번호정보, unint16_t로 정의

sin_family의 주소체계

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

IP 주소

struct in_addr{
	in_addr_t s_addr; //32bit IPv4 인터넷 주소 40억까지의 주소가능
}

이 4바이트 숫자를 이진수로 변경 후, 1바이트씩 끊어서 10진법으로 표현

sockaddr_in

위에서 본 sockaddr_in은 IPv4 전용 구조체이다.

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

원래 bind 함수는 다양한 주소체계를 담을 수 있는 sockaddr로 매개변수로 받는다.
그러한 이유로 형변환이 일어난다.
원래는 IP 주소를 sa_data[14]에 저장해야하지만, IPv4 주소를 담기 불편하기 때문에 sockaddr_in을 사용하는 것이다.

profile
열심히 안 사는 사람

0개의 댓글