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_instruct sockaddr_in6ai_addrlen成员告诉您该结构有多大,即返回sizeof (struct sockaddr_in)sizeof (struct sockaddr_in6)
这些结构包含二进制IP地址、端口号(对于TCP或UDP等传输协议)、系列(在struct addrinfo中也重复)和其他数据(查看linux文档时,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上进行算术运算,这不是一个好主意,因为类型可能因操作系统而异,而且没有任何逻辑。如果您有特定的用例或特定的代码,我可以添加更多的细节。

关于c - 如何获取getaddrinfo()返回的ai_addr-> sa_data的实际大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25959188/

10-12 14:51
查看更多