(인터넷 주소란 인터넷 상에서 컴퓨터를 구분하는 목적으로 사용되는 주소이다.
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: 로컬 통신을 위한 유닉스 프로토콜의 주소체계
struct in_addr{ in_addr_t s_addr; //32bit IPv4 인터넷 주소 40억까지의 주소가능 }
이 4바이트 숫자를 이진수로 변경 후, 1바이트씩 끊어서 10진법으로 표현
위에서 본 sockaddr_in은 IPv4 전용 구조체이다.
struct sockaddr{ sa_family_t sin_family; char sa_data[14]; }
원래 bind 함수는 다양한 주소체계를 담을 수 있는 sockaddr로 매개변수로 받는다.
그러한 이유로 형변환이 일어난다.
원래는 IP 주소를 sa_data[14]에 저장해야하지만, IPv4 주소를 담기 불편하기 때문에 sockaddr_in을 사용하는 것이다.