59

我的疑问与 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是 type struct in_addr

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

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

一切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
};
4

3 回答 3

32

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;

唯一的要求是它包含一个 member s_addr

于 2012-12-20T19:31:15.610 回答
8

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

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

于 2012-12-20T19:31:04.140 回答
8

struct in_addris a more than just an integer 是因为它可能有超过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成员的结构。

于 2015-09-25T12:02:46.860 回答