<지식인에서 펐음, 출처는 기억이 안남>

struct sockaddr_in과 struct sockaddr중 sockaddr_in을 쓴 상태에서 sockaddr을 캐스팅 시킬수 있는 이유는?

->

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바이트의 배열에다가 포트와 아이피를 그냥 갖다넣기는 좀 번거롭겠죠?



ps) sockaddr과 sockaddr_in은  bind함수 부문에서 사용된다.

+ Recent posts