반응형

구조체 sockaddr_in의 멤버

 

 

이제 sockaddr_in 구조체의 멤버들을 자세히 파헤쳐보자.

 

-

 

※ 멤버 sin_family ※

 

프로토콜 체계마다 적용하는 주소체계가 다 다르다.

 

예를 들어서

 

IPv4에서는 4byte 주소체계를 사용하고,

 

IPv6에서는 16byte 주소체계를 사용한다.

 

그래서 아래의 사진을 참조하여 멤버 sin_family에 적용할 주소체계 정보를 저장해야 한다.

 

-

 

 

-

 

위 사진의 내용중에서 AF_LOCAL은 잘 사용하지 않지만,

 

"이런 주소체계도 있구나" 하고 알아두면 좋다.

 

-

 

※ 멤버 sin_port ※

 

16bit(2byte) PORT번호를 저장한다.

 

단, "네트워크 바이트 순서"로 저장해야 한다.

 

사실 이 멤버는 PORT번호를 저장한다는 것보다,

 

네트워크 바이트 순서로 저장해야 한다는 것이 더 중요하다.

 

-

 

※ 멤버 sin_addr ※

 

32bit(4byte) IP주소 정보를 저장한다.

 

이 멤버 또한 "네트워크 바이트 순서"로 저장해야 한다.

 

이 멤버를 정확히 파악하기 위해서는 구조체 in_addr도 같이 알아야 한다.

 

그런데 구조체 in_addr의 유일한 멤버가 uint32_t로 선언되어 있으니,

 

간단히 32bit 정수 자료형으로 인식해도 괜찮다.

 

-

 

※ 멤버 sin_zero ※

 

특별한 의미를 지니지 않는 멤버이다.

 

단순히 구조체 sockaddr_in의 크기를 구조체 sockaddr와 일치시키기 위해서 삽입된 멤버이다.

 

하지만, 반드시 0으로 채워야 한다.

 

만약 0으로 채우지 않으면 원하는 결과를 얻지 못한다.

 

-

 

※ 구조체 sockaddr ※

 

이전에 나왔던 서버 코드와 클라이언트 코드를 봐서 알겠지만,

 

sockaddr_in 구조체 변수의 주소 값은

 

bind 함수의 인자로 아래의 사진과 같이 전달된다.

 

bind 함수에 대한 자세한 설명은 나중에 다루도록 하고, 

 

일단 인자 전달과 형 변환 위주로만 코드를 배우자

 

-

 

 

-

 

위 사진의 내용인 bind 함수의 중요한 것은 두 번째 전달 인자이다.

 

bind 함수는 sockaddr 구조체 변수의 주소 값을 요구한다.

 

앞서 설명한 주소체계, PORT번호, IP주소 정보를 담고 있는 

 

sockaddr 구조체 변수의 주소 값을 요구하는 것이다.

 

근데 아래의 사진의 내용처럼 구조체 sockaddr

 

이들 정보를 담기에 좀 불편하게 정의되어 있다.

 

-

 

 

-

 

위 사진의 구조체 멤버 sa_data에 저장되는 주소 정보에는 IP주소와 PORT번호가 포함되어야 한다.

 

그리고 이 두 가지 정보를 담고, 남은 부분은 0으로 채울 것을 bind 함수는 요구한다.

 

하지만 이는 주소 정보를 담기에 매우 불편한 요구사항이다.

 

그래서 구조체 sockaddr_in이 등장한 것이다.

 

sockaddr_in 구조체 멤버를 앞서 설명한 대로 주소체계, IP 정보, PORT번호를 채우면,

 

이때 형성되는 sockaddr_in 구조체 변수의 바이트 열 bind 함수가 요구하는 바이트 열이 된다.

 

결국 인자 전달을 위한 형 변환을 통해 sockaddr 구조체 변수에 bind 함수가 요구하는대로

 

데이터를 채워 넣은 효과를 볼 수 있다.

 

-

 

※ + sin_family ※

 

sockaddr_in IPv4의 주소 정보를 담기 위해 정의된 구조체이다.

 

그럼에도 불구하고 주소체계 정보를 구조체 멤버 sin_family에 별도로 저장하는 이유

 

구조체 sockaddr IPv4의 주소 정보만을 담기 위해서 정의된 구조체가 아니다.

 

주소 정보를 담는 배열 sa_data의 크기가 14byte인 것만 봐도 알 수 있다.

 

따라서 구조체 sockaddr에서는 주소체계 정보를 구조체 멤버 sin_family에 저장할 것을 요구한다.

 

그렇기에, 구조체 sockaddr과 동일한 바이트 열을 편히 구성하기 위해

 

정의된 구조체 sockaddr_in에도 주소체계 정보를 담기 위한 멤버가 존재하는 것이다.

반응형

+ Recent posts