출처 : http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=68634535&qb=U09DS0FERFI

sockaddr(2바이트+14바이트)와 sockaddr_in(2바이트+2바이트+4바이트+8바이트)은 정확하게 16바이트로 사이즈가 똑같습니다...^^;
그렇기 때문에 바로 캐스팅이 되는거죠.

sockaddr_in은 rfc표준으로 정해진 주소sockaddr(sockaddr은 TCP/IP만을 위한 것이 아니거든요)를 우리가 주로 사용하는 Internet address familly구조(프로토콜들 종류가 많죠?;)에 사용하기 쉽게 하려고 세분화한것이라고 생각하면 쉽습니다. 고로 케스팅 그냥 해주시면 됩니다.. 

sockaddr_in은 다음과 같구요. 

struct sockaddr_in{
  short sin_family;  // 2바이트
  unsigned short sin_port;  // 2바이트
  IN_ADDR sin_addr;  // 4바이트
  char sin_zero[8];  // 8바이트(실제 사용되지는 않구요. sockaddr과 사이즈를 맞추기 위함)
}; 

sockaddr_in중의 IN_ADDR은 다음과 같습니다. 

struct in_addr {
  union {
    struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; // 4바이트
    struct { u_short s_w1,s_w2; } S_un_w;  // 4바이트
  u_long S_addr;  // 4바이트
  } S_un;
}; 

단, union으로 정의되었기때문에 총 4바이트가 되는 거죠.
sockaddr은 다음과 같습니다. 

struct sockaddr {
  u_short sa_family// 2바이트
  char sa_data[14];  // 14바이트
}; 

sockaddr을 사용하지 않고 sockaddr_in이라는 것을 정의하여 사용하는 이유는 사용의 편의를 위해서입니다.
한번 생각해보세요;  14바이트의 배열에다가 포트와 아이피를 그냥 갖다넣기는 좀 번거롭죠?

Posted by leafbird 트랙백 0 : 댓글 0

댓글을 달아 주세요