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

时间:2013-09-22 16:59:48

标签: c linux sockets network-programming ipv4

这是 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];  
};

1 个答案:

答案 0 :(得分:5)

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

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