我的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结构。什么是从res中已有的信息填充sin6_addr的好方法?这里是C编程的新手。
答案 0 :(得分:1)
您获得的具体错误是因为:
*(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
,{{1}等函数},sendto
等。在这一点上,我们谈论的是风格问题和良好的编程实践,而不是语言的正确性。
请注意,如果您只是想获取IPv6地址以便将其打印为字符串,那么带有recvfrom
标志的getnameinfo
函数可以让您以抽象的方式执行此操作而无需戳穿不透明的NI_NUMERICHOST
。