这是 netinet / in.h
中定义的互联网(IPv4)套接字地址结构struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
struct in_addr {
in_addr_t s_addr;
};
这里仅对地址字段需要单独的结构。
为什么我们不能使用以下结构?
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
in_addr_t sin_addr;
char sin_zero[8];
};
答案 0 :(得分:5)
这是出于历史原因。在套接字编程的早期,struct in_addr
包含各种结构的union
,因此您可以获得单个字节。当子网划分和无类别寻址出现时,此union
变得不必要了,但为简单的struct
切换unsigned long
会破坏大量代码,所以它只是保持这种状态。
如果您对网络编程感兴趣并且还没有获得UNIX Network Programming的副本,那么我强烈建议您这样做,这对于像这样的小细节来说是个金矿。