我的地址指针看起来是这样的-
struct addrinfo hint, *res = NULL;然后我打电话给get地址。
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程序设计的新手。
发布于 2017-07-27 23:10:06
您所遇到的具体错误是因为:
*(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地址,以便将其打印为字符串,则带有NI_NUMERICHOST标志的getnameinfo函数可以以抽象的方式完成此操作,而不必通过不透明的struct sockaddr *。
https://stackoverflow.com/questions/45362305
复制相似问题