sockaddr_in中需要单独的地址结构?

suj*_*jin 5 c sockets linux network-programming ipv4

这是netinet/in.h中定义的Internet(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;                                          
};
Run Code Online (Sandbox Code Playgroud)

这里仅对地址字段需要单独的结构.

为什么我们不能使用以下结构?

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

Cro*_*man 5

这是出于历史原因.在套接字编程的早期,struct in_addr包含了union各种结构,因此您可以获得单个字节.union当子网划分和无类别寻址出现时,这变得不必要了,但是换掉struct一个简单的unsigned long会破坏很多代码,所以它只是保持这种状态.

如果您对网络编程感兴趣并且还没有获得UNIX网络编程的副本,那么我强烈建议您这样做,这对于像这样的小细节来说是个金矿.