Socket Programming을 할때에 소캣을 생성하고 connect ,bind 등등 할때에 소캣에 IP, PORT를 넣어주어야 하는데 이때 미리 선언되어 있는 Socket 구조체에 넣어준다.

 

struct sockaddr_in

{

sa_family_t    sin_family;        //주소체계를 저장함.

uint16_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 인터넷 주소

};

 

위의 자료형중에 uint16_t라던지 in_addr_t와 같은 자료형은 POSIX(Portable Operating System Interface)에 나와있는데, POSIX란, 유닉스 계열의 운영체제에 적용하기 위한 표준을 의미한다. 

따로 자료형을 정의해 놓은 이유는 확장성을 고려한 결과이다. int32_t라는 자료형은 이후에 int가 64비트로 표현되는 경우에도 4바이트 자료형임을 보장받을 수 있다. 즉 어떠한 경우에도 int32_t는 4바이트로 표현됨.

 

구조체 멤버 분석

 

sin_family

멤버sin_family에 적용할 주소체계 정보를 저장.

 

 

sin_port

16비트 PORT주소 정보를 저장한다. '네트워크 바이트 순서'대로 저장해야 한다.(빅 에디안)

 

sin_addr

32비트 IP주소 정보를 저장한다.  이역시 빅에디안 순서대로 저장.

 

sin_zero

특별한 의미없음.sockaddr 구조체와 일치시키기 위해 삽입된 멤버.

struct sockaddr{

sa_family_t    sin_family;     //주소체계 저장.

char             sa_data[14]; //주소 정보.

};

 

위의 구조체 멤버 sa_data에 저장되는 주소정보에는 IP주소와 PORT번호가 포함되어야 하고,이 두가지 정보를 담고 남은 부분은 0으로 채울 것을 요구한다.

sockaddr_in에 sin_zero가 존재하는 이유

하지만 이는 주소정보를 담기에 매우 불편한 사항이기 때문에 sockaddr_in이 등장한 것이다.

sockaddr_in구조체 멤버를 채우고 난뒤에 이때 형성되는 구조체 변수의 바이트 열이 요구하는 바이트 열이 되기 때문에 인자전달을 위한 형변환만 시켜주면 바로 요구사항을 채워줄수 있다.

따라서 sockaddr_in에 필요한 정보를 채우고 bind함수를 호출할 때에는 (struct sockaddr *)로 형변환을 시켜주면 간단하게 해결됨.

 

'Programming > Socket' 카테고리의 다른 글

클라이언트 IP 가져오기  (0) 2012.05.14
멀티프로세스 소스  (0) 2012.05.10
멀티프로세스 서버  (0) 2012.05.08
소켓의 옵션  (0) 2012.05.07
TCP server 함수호출 순서.  (0) 2012.04.25

+ Recent posts