为什么sin_addr在结构in_addr中?

Dee*_*eyi 53 c unix sockets

我怀疑与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
};
Run Code Online (Sandbox Code Playgroud)

这里的成员sin_addr属于类型struct in_addr.

但我不明白为什么有人愿意这样做,因为所有人struct inaddr都有:

struct in_addr {
    unsigned long s_addr;          // load with inet_pton()
};
Run Code Online (Sandbox Code Playgroud)

所有人in_addr只是一个成员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
};
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 31

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;
Run Code Online (Sandbox Code Playgroud)

唯一的要求是它包含一个成员s_addr.

  • 更确切地说,`sin_addr.s_addr`导致表示地址的32位整数类型的左值.AFAIR我也看到过像#define s_addr S_un.S_addr`这样的东西.但这是非常愚蠢的事情 - 或者仅仅是来自真正迟钝的C语言的时代,它不支持匿名工会. (3认同)

oua*_*uah 8

因为该in_addr结构可能包含多个成员.

http://pubs.opengroup.org/onlinepubs/009604599/basedefs/netinet/in.h.html

  • 这基本上回答了所有要回答的问题.`struct in_addr`存在的原因是因为它*可能*不只是一个整数. (3认同)

Yu *_*Hao 7

struct in_addr不仅仅是一个整数,因为它可能有更多in_addr_t.在许多系统中,它有一个union,并且这种实现的原因是用于现在不使用的A/B/C类地址.

Unix网络编程第1卷详细解释了历史原因:

sin_addr成员是一个结构而不仅仅是一个结构的原因in_addr_t是历史的.早期版本(4.2BSD)将in_addr结构 定义union为各种结构,以允许访问4位字节中的每一个以及32位IPv4地址中包含的两个16位值.这与A,B和C类地址一起用于获取地址的相应字节.但随着子网划分的出现以及随着无类别寻址的各种地址类的消失,对联合的需求消失了.今天的大多数系统已经废除了union并且只是定义in_addr为具有单个in_addr_t成员的结构.