getaddrinfo()填充struct addrinfo
字段中存储的实际压缩地址。struct sockaddr *ai_addr
具有具有实际二进制地址表示的字段struct sockaddr
。我想使用char *sa_data
将此sa_数据复制到另一个变量,为此我需要知道此字段的实际长度。
我想艾德伦是我需要的。但实际上,IPv4返回16,IPv6返回28。我想太多了。那么,最正确的方法是什么?可能是memcpy()
或length = sa_family == AF_INET ? 4 : 16
?
最佳答案
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
中也重复)和其他数据(查看linux文档时,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
上进行算术运算,这不是一个好主意,因为类型可能因操作系统而异,而且没有任何逻辑。如果您有特定的用例或特定的代码,我可以添加更多的细节。关于c - 如何获取getaddrinfo()返回的ai_addr-> sa_data的实际大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25959188/