我的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_addr
的struct addrinfo
成员并不是真正的直接访问对象,而是被抽象地使用,并且仅传递给connect
,bind
,sendto
,recvfrom
等函数。重点是我们谈论的是样式和良好的编程习惯,而不是每种语言的正确性。请注意,如果您只是想获取IPv6地址以将其打印为字符串,则带有
getnameinfo
标志的NI_NUMERICHOST
函数可让您以抽象的方式执行此操作,而不必遍历不透明的struct sockaddr *
。关于c - 如何从addrinfo获取sin6_addr?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45362305/