sockaddr_in에서 IPv4 주소는 왜 구조체로 선언되나요??

tyolee83의 이미지

네트워크 프로그래밍 초보입니다.

막 공부하다가 궁금한것이 생겨서요...

sockaddr_in 구조체를 보면

struct sockaddr_in{
sa_family_t sin_family;
uint16_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};

이렇게 되어있구요 다시 in_addr 구조체가

struct in_addr{
uint32_t s_addr;
};

이렇게 선언 되어 있잖아요..

제 생각엔 sockaddr_in 에 ip address넣는 부분에 그냥

uint32_t sin_addr;

이런식으로 선언되어 있어도 될것 같은데요...

(sockaddr_in 자체가 IPv4를 나타내는 구조체니까)

왜 이런식으로 다시 한번 구조체로 들어가는지 궁금합니다.

도와주세요~

raymundo의 이미지

http://kldp.org/Translations/html/Socket_Programming-KLDP/Socket_Programming-KLDP.html

살아남은 가장 뭣같은 유니온인 struct in_addr 에 대한 보다 신중한 검토가 필요할 것같다.

/* Internet address (a structure for historical reasons) */
struct in_addr {
unsigned long s_addr;
};

음.. 이것은 유니온 "이었었"다. 그러나 그런 시절은 지나갔다. 시원하게 없어졌군! 따라서 만약 "ina"를 struct sockaddr_in형으로 정의해 놓았다면 ina.sin_addr.s_addr 로 NBO 상태의 4바이트 인터넷 어드레스를 정확하게 참조할 수 있을 것이다. 만약 사용하는 시스템이 struct in_addr에 그 끔찍한 유니온을 아직도 사용하고 있더라도 #defines S 덕분에 위에 한것과 마찬가지로 정확하게 참조할 수는 있을 것이다.

라는군요. ^^;

좋은 하루 되세요!