如何从addrinfo获取sin6_addr?

时间:2017-07-27 22:57:30

标签: c sockets

我的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编程的新手。

1 个答案:

答案 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并非真正意味着直接访问,而是抽象地使用,只是传递给connectbind,{{1}等函数},sendto等。在这一点上,我们谈论的是风格问题和良好的编程实践,而不是语言的正确性。

请注意,如果您只是想获取IPv6地址以便将其打印为字符串,那么带有recvfrom标志的getnameinfo函数可以让您以抽象的方式执行此操作而无需戳穿不透明的NI_NUMERICHOST