gpt4 book ai didi

c - 如何从 addrinfo 获取 sin6_addr?

转载 作者:行者123 更新时间:2023-11-30 14:55:51 25 4
gpt4 key购买 nike

我的 addrinfo 指针看起来像这样 -

struct addrinfo hint, *res = NULL;

然后我调用 get addrinfo。

hint.ai_family = AF_UNSPEC;  
ret = getaddrinfo(curhost, NULL, &hint, &res);

curhost 是一个字符数组。正在做

saddrv6.sin6_addr=*(res->ai_addr).sin6_addr

给我一​​个错误,上面写着

请求非结构或 union 中的成员“sin6_addr”。 Saddrv6 是一个 sockaddr_in6 结构。从 res 中已有的信息填充 sin6_addr 的好方法是什么?这里是 C 编程新手。

最佳答案

您收到的具体错误是因为:

*(res->ai_addr).sin6_addr

. 运算符比 * 绑定(bind)得更紧密。您可以将其更改为:

(*res->ai_addr).sin6_addr

这可能就是您的意思,但更好的方法是使用 -> 运算符:

res->ai_addr->sin6_addr

但是,这仍然不起作用,因为 ai_addr 具有无用的不透明类型 struct sockaddr *,而不是 struct sockaddr_in6 *。要解决此问题,您需要将其转换为指向它实际指向的类型的指针:

((struct sockaddr_in6 *)res->ai_addr)->sin6_addr

此时您的代码应该可以工作。然而,最终 struct addrinfoai_addr 成员并不是真正要直接访问的,而是抽象使用的,只是传递给 connect 等函数, bindsendtorecvfrom 等。此时,我们讨论的是风格和良好编程实践的问题,而不是正确性问题。不过,语言。

请注意,如果您只想获取 IPv6 地址以便将其打印为字符串,则可以使用带有 NI_NUMERICHOST 标志的 getnameinfo 函数来执行此操作一种抽象的方式,而不必探究不透明的struct sockaddr *

关于c - 如何从 addrinfo 获取 sin6_addr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45362305/

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