2017-07-27 77 views
0

我addrinfo中指针看起来像这 -如何从addrinfo获取sin6_addr?

struct addrinfo hint, *res = NULL; 

然后我打电话让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编程新手。

回答

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不是直接访问,而是抽象地使用,只是传递给像connectbindsendto,recvfrom等功能。在这一点上,我们谈论的是一个风格和良好的问题编程实践,而不是每种语言的正确性。

注意,如果你只是想打印的是一个字符串的缘故IPv6地址,该getnameinfo功能与NI_NUMERICHOST标志让你以抽象的方式,而不必通过不透明struct sockaddr *捅做到这一点。

+0

谢谢!投到sockaddr_in6摆脱了错误 – aupreti