我怀疑与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.
因为该in_addr结构可能包含多个成员.
http://pubs.opengroup.org/onlinepubs/009604599/basedefs/netinet/in.h.html
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成员的结构.