如何获取getaddrinfo返回的ai_addr-> sa_data的实际大小()

问题描述:

getaddrinfo()填充struct addrinfo其中实际打包地址存储在struct sockaddr *ai_addr字段中。 struct sockaddr具有实际的二进制地址表示的字段char *sa_data。我想将这个sa_data复制到另一个使用memcpy()的变量,为此我需要知道该字段的实际长度。如何获取getaddrinfo返回的ai_addr-> sa_data的实际大小()

我觉得ai_addrlen是我需要的。但事实上,IPv4返回16,IPv6返回28。我想太多了。那么,获得sa_data长度的最正确方法是什么?可能是length = sa_family == AF_INET ? 4 : 16length = ai_addrlen - 12

getaddrinfo()函数返回由struct addrinfo记录组成的链表。这些记录中的每一个都包含一个指向struct sockaddr的指针,它是一个多态类型,其后面实际上有一个struct sockaddr_instruct sockaddr_in6ai_addrlen会员告诉你该结构有多大,即返回sizeof (struct sockaddr_in)sizeof (struct sockaddr_in6)

这些结构包含二进制IP地址,端口号(用于TCP或UDP等传输协议),家庭(在struct addrinfo中也重复)以及其他数据(用于IPv6的flowinfo和scope_id) )。

实际的二进制地址位于struct sockaddr_instrict sockaddr_in6内,分别为struct in_addr sin_addrstruct in6_addr sin6_addr。您可以使用这些字段或类型来确定大小。

length = sa_family == AF_INET ? sizeof (struct in_addr) : sizeof (struct in6_addr) 

由于这些是已知的数字,你当然可以使用你已经在你的问题。

length = sa_family == AF_INET ? 4 : 16 

但你也试着做ai_addrlen算术,这是不是一个好主意,因为类型可以通过操作系统和变化有一个在没有逻辑反正。如果您有特定用例或特定代码,我可以添加更多详细信息。

+0

谢谢澄清! – 2014-09-21 12:56:42