为什么我们需要一个单独的结构来保存 32 位 IPv4 地址

Why do we need a separate structure to hold the 32-bit IPv4 address

对于 IPv4 地址的套接字编程,我们需要使用以下结构来设置 client/server 的地址。

struct in_addr {

  in_addr_t s_addr; 
};

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

我的问题是为什么我们需要结构in_addr?我们不能把 in_addr_t 字段放在 sockaddr_in 中吗?

它是特定于平台的。在 Windows in_addr 上定义为以下结构,它允许您访问地址的个人 bytes 和 shorts (documentation):

struct in_addr {
  union {
    struct {
      u_char s_b1;
      u_char s_b2;
      u_char s_b3;
      u_char s_b4;
    } S_un_b;
    struct {
      u_short s_w1;
      u_short s_w2;
    } S_un_w;
    u_long S_addr;
  } S_un;
};