socket中三种地址结构体的关系

本文详细介绍了socket编程中sa_family字段的作用,及其可能的值AF_INET、AF_INET6和AF_UNSPEC的含义。当设置为AF_UNSPEC时,函数可以返回IPv4和IPv6的地址信息。通常使用的是AF_INET。此外,文章还解释了sockaddr_in结构体的组成部分,如sin_family、sin_port、sin_addr和sin_zero,并提及了in_addr共用体的三种IP地址表示方式及inet_addr和inet_ntoa函数的用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struct sockaddr {
  unsigned short sa_family; /* address family, AF_xxx */
  char sa_data[14]; /* 14 bytes of protocol address */
  };

说明:

sa_family:是2字节的地址家族,一般都是“AF_xxx”的形式,它的值包括三种:AF_INETAF_INET6AF_UNSPEC

如果指定AF_INET,那么函数就不能返回任何IPV6相关的地址信息;如果仅指定了AF_INET6,则就不能返回任何IPV4地址信息。

AF_UNSPEC则意味着函数返回的是适用于指定主机名和服务名且适合任何协议族的地址。如果某个主机既有AAAA记录(IPV6)地址,同时又有A记录(IPV4)地址,那么AAAA记录将作为sockaddr_in6结构返回,而A记录则作为sockaddr_in结构返回

通常用的都是AF_INET

struct sockaddr_in {
  short int sin_family; /* Address family */
  unsigned short int sin_port; /* Port number */
  struct in_addr sin_addr; /* Internet address */
  unsigned char sin_zero[8]; /* Same size as struct sockaddr */
  };

 sin_family:指代协议族,在socket编程中只能是AF_INET

  sin_port:存储端口号(使用网络字节顺序)

  sin_addr:存储IP地址,使用in_addr这个数据结构

  sin_zero:是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。

typedef struct in_addr {
  union {
  struct{ unsigned char s_b1,s_b2, s_b3,s_b4;} S_un_b;
  struct{ unsigned short s_w1, s_w2;} S_un_w;
  unsigned long S_addr;
  } S_un;
  } IN_ADDR;

阐述下in_addr的含义,很显然它是一个存储ip地址的共用体有三种表达方式:

第一种用四个字节来表示IP地址的四个数字;

第二种用两个双字节来表示IP地址;

第三种用一个长整型来表示IP地址。

给in_addr赋值的一种最简单方法是使用inet_addr函数,它可以把一个代表IP地址的字符串赋值转换为in_addr类型,如addrto.sin_addr.s_addr=inet_addr("192.168.0.2");

其反函数是inet_ntoa,可以把一个in_addr类型转换为一个字符串。




Struct sockaddr_insockaddr指针强制转换时sockaddr_in的sin_family对应struct sockaddr sa_family,struct sockaddr_in的sin_port、sin_addr、sin_zero[8]对应sockaddr sa_data[14]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值