首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从地址信息中获取sin6_addr?

如何从地址信息中获取sin6_addr?
EN

Stack Overflow用户
提问于 2017-07-27 22:57:30
回答 1查看 506关注 0票数 0

我的地址指针看起来是这样的-

代码语言:javascript
复制
struct addrinfo hint, *res = NULL;

然后我打电话给get地址。

代码语言:javascript
复制
hint.ai_family = AF_UNSPEC;  
ret = getaddrinfo(curhost, NULL, &hint, &res);

curhost是一个字符数组。正在做什么

代码语言:javascript
复制
saddrv6.sin6_addr=*(res->ai_addr).sin6_addr

是给了我一个错误说

请求成员'sin6_addr‘的东西,而不是一个结构或联合。saddrv6是一个sockaddr_in6结构。从我已经拥有的信息中填充sin6_addr的好方法是什么?这里是C程序设计的新手。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-27 23:10:06

您所遇到的具体错误是因为:

代码语言:javascript
复制
*(res->ai_addr).sin6_addr

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

代码语言:javascript
复制
(*res->ai_addr).sin6_addr

这可能就是您的意思,但更好的方法是使用->运算符:

代码语言:javascript
复制
res->ai_addr->sin6_addr

但是,这仍然不起作用,因为ai_addr有无用的不透明类型struct sockaddr *,而不是struct sockaddr_in6 *。要解决这个问题,您需要将其转换为指向它实际指向的类型的指针:

代码语言:javascript
复制
((struct sockaddr_in6 *)res->ai_addr)->sin6_addr

此时,您的代码应该可以工作。然而,最终,ai_addr成员的struct addrinfo并不是真正要直接访问的,而是抽象地使用,只是传递给诸如connectbindsendtorecvfrom等函数。不过,在这一点上,我们讨论的是风格和良好的编程实践,而不是语言的正确性。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45362305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档