gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:09 25 4
gpt4 key购买 nike

getaddrinfo() 填充 struct addrinfo,其中实际打包地址存储在 struct sockaddr *ai_addr 字段中。 struct sockaddr 的字段 char *sa_data 具有实际的二进制地址表示。我想使用 memcpy() 将这个 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 等传输协议(protocol))、家族(也在 struct addrinfo 中重复)和其他数据(flowinfo 和 scope_id IPv6,在查看 linux 文档时)。

实际的二进制地址在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com