source

왜 sin_addr이 구조체 내부에 in_addr이 있습니까?

goodcode 2022. 8. 14. 11:59
반응형

왜 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 inaddrhas는 다음과 같습니다.

struct in_addr {
    unsigned long s_addr;          // load with inet_pton()
};

모든.in_addrhas는 한 명의 멤버일 뿐이다.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

반응형