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 |