IPv4,IPv6套接字地址结构

1.IPv4套接字地址结构

struct in_addr{
  in_addr_t s_addr;//unsigned int
};
struct sockaddr_in{
  //uint8_t sin_len 这个字段可能在其他系统上有,我的系统是ubuntu 19.04 下面介绍的地址结构类似
  sa_familiy_t sin_family;//unsigned short
  in_port_t sin_port;//unsigned short
  struct in_addr sin_addr;
  unsigned char sin_zero[sizeof(struct sockaddr) - 
sizeof(sa_familiy_t) - sizeof(in_port_t) - sizeof(struct in_addr)];
};

sin_family指明了属于哪个协议族。sin_port指明了端口号(0-65535),sin_addr.s_addr指明了网络二进制字节序值。sin_zero可以从上面看出就是用了填充字节的,使得该结构和sockaddr通用套接字地址结构的大小相同。

2.通用套接字地址结构是什么?

通用套接字地址结构主要是为了方便处理不同协议族的套接字地址结构,即在需要传递套接字地址结构时通常采用struct sockaddr *sa作为形参。

struct sockaddr{
  //uint8_t sa_len;
  sa_family_t sin_familiy;
  char sa_data[14];
};

3.IPv6套接字地址结构:

struct in6_addr{
  union{//在我的系统上是用union结构实现的
    uint8_t __u6_addr8[16];//unsigned char
    uint16_t __u6_addr16[8];//unsigned short
    uint32_t __u6_addr32[4];//unsigned int
  }__in6_u;
};

struct sockaddr_in6{
  sa_family_t sin6_familiy;
  int_port_t sin6_port;
  uint32_t sin6_flowinfo;
  struct in6_addr sin6_addr;
  uint32_t sin6_scope_id;
}
;

IPv6的地址族为AF_INET6。sin6_addr字段为128位。sin6_flowinfo字段分为2个字段:低序20位是flow label,高序12位保留。

对于具备范围的地址,sin6_scope_id字段标识其范围,最常见的是链路局部地址的接口索引。

4.新的通用套接字地址结构:

struct sockaddr_storage{
    sa_family_t ss_family;    /* Address family, etc.  */
    char __ss_padding[_SS_PADSIZE];
    __ss_aligntype __ss_align;    /* Force desired alignment.  */
};

sockaddr_storage能够容纳系统支持的任何套接字地址结构。

5.Unix域套接字地址结构

6.数据链路套接字地址结构

...未完待续

原文地址:https://www.cnblogs.com/zhuiyicc/p/11801279.html