왜 sin_addr이 구조체 내부에 in_addr이 있습니까?
UNIX의 소켓 구조는 다음과 같습니다.
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
여기 멤버sin_addr
종류struct in_addr
.
근데 왜 그렇게 하고 싶은지 모르겠어struct inaddr
has는 다음과 같습니다.
struct in_addr {
unsigned long s_addr; // load with inet_pton()
};
모든.in_addr
has는 한 명의 멤버일 뿐이다.s_addr
왜 우리는 이런 것을 가질 수 없는가?
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
unsigned long s_addr ;
char sin_zero[8]; // zero this if you want to
};
struct in_addr
어떤 시스템을 사용하느냐에 따라 다른 경우가 있습니다.Windows 의 경우는, 다음과 같습니다.
typedef struct in_addr {
union {
struct {
u_char s_b1,s_b2,s_b3,s_b4;
} S_un_b;
struct {
u_short s_w1,s_w2;
} S_un_w;
u_long S_addr;
} S_un;
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
유일한 요건은 멤버를 포함하는 것입니다.s_addr
.
왜냐하면in_addr
구조에 둘 이상의 멤버가 포함될 수 있습니다.
http://pubs.opengroup.org/onlinepubs/009604599/basedefs/netinet/in.h.html
struct in_addr
단순한 정수보다 더 많은 정수를 가질 수 있기 때문입니다.in_addr_t
. 많은 시스템에서 이 시스템은union
이러한 실장의 이유는 현재 사용되지 않는 클래스 A/B/C 주소입니다.
Unix Network Programming Volume 1 에서는, 과거의 이유에 대해 자세하게 설명합니다.
그 이유는
sin_addr
구성원은 구조체이며, 단순한 구조체가 아닙니다.in_addr_t
는 이력입니다.이전 릴리스(4.2BSD)에서는in_addr
로서 구조화하다union
각 4바이트 및 32비트 IPv4 주소 내에 포함된 16비트 값에 대한 액세스를 허용합니다.이것은 클래스 A, B 및 C 주소와 함께 사용되며 주소의 적절한 바이트를 가져옵니다.그러나 서브넷화가 등장하고 클래스리스 어드레싱을 가진 다양한 주소 클래스가 사라지면서 결합의 필요성이 사라졌습니다.오늘날 대부분의 시스템에서는,union
정의만 내리면 됩니다.in_addr
단일 구조로서in_addr_t
멤버입니다.
언급URL : https://stackoverflow.com/questions/13979150/why-is-sin-addr-inside-the-structure-in-addr
'source' 카테고리의 다른 글
Vue.js 슬롯 내의 템플릿태그를 사용하려면 어떻게 해야 하나요? (0) | 2022.08.14 |
---|---|
C와 C++는 구조 내 어레이의 멤버별 할당을 지원하지만 일반적으로는 지원하지 않는 이유는 무엇입니까? (0) | 2022.08.14 |
Java: System.console()에서 입력을 받는 방법 (0) | 2022.08.14 |
CMake에서의 디버깅과 릴리스 (0) | 2022.08.14 |
Vue.js를 사용하여 단일 파일 구성 요소의 메서드에서 계산된 속성에 액세스하는 방법 (0) | 2022.08.14 |