如何获取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 : 16
或length = ai_addrlen - 12
?
getaddrinfo()
函数返回由struct addrinfo
记录组成的链表。这些记录中的每一个都包含一个指向struct sockaddr
的指针,它是一个多态类型,其后面实际上有一个struct sockaddr_in
或struct sockaddr_in6
。 ai_addrlen
会员告诉你该结构有多大,即返回sizeof (struct sockaddr_in)
或sizeof (struct sockaddr_in6)
。
这些结构包含二进制IP地址,端口号(用于TCP或UDP等传输协议),家庭(在struct addrinfo
中也重复)以及其他数据(用于IPv6的flowinfo和scope_id) )。
实际的二进制地址位于struct sockaddr_in
和strict sockaddr_in6
内,分别为struct in_addr sin_addr
和struct 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
算术,这是不是一个好主意,因为类型可以通过操作系统和变化有一个在没有逻辑反正。如果您有特定用例或特定代码,我可以添加更多详细信息。
谢谢澄清! – 2014-09-21 12:56:42