我的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


给我一个错误,说

要求成员“ sin6_addr”使用非结构或联合的形式。 saddrv6是sockaddr_in6结构。从我已有的信息中填充sin6_addr的好方法是什么?这里是C编程的新手。

最佳答案

您收到的特定错误是因为:

*(res->ai_addr).sin6_addr


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

(*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


此时,您的代码应该可以工作了。但是,最终ai_addrstruct addrinfo成员并不是真正的直接访问对象,而是被抽象地使用,并且仅传递给connectbindsendtorecvfrom等函数。重点是我们谈论的是样式和良好的编程习惯,而不是每种语言的正确性。

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

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

10-12 20:49