5

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

1 回答 1

5

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

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

于 2013-09-22T17:12:12.803 回答