C 如何从addrinfo获取sin6_addr?

C 如何从addrinfo获取sin6_addr?,c,sockets,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 给我一个错误,说 在非结构或联盟中请求成员“sin

我的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_地址的好方法是什么?这里是C编程新手

您得到的具体错误是因为:

*(res->ai_addr).sin6_addr
这个。运算符绑定比*更紧密。您可以将其更改为:

(*res->ai_addr).sin6_addr
这可能就是您的意思,但更好的方法是使用->运算符:

res->ai_addr->sin6_addr
但是,这仍然不起作用,因为ai_addr具有无用的不透明类型struct sockaddr*,而不是struct sockaddr_in 6*。要解决此问题,您需要将其强制转换为指向其实际指向的类型的指针:

((struct sockaddr_in6 *)res->ai_addr)->sin6_addr
此时,您的代码应该可以工作。然而,struct addrinfo的ai_addr成员最终并不是真正意义上的直接访问,而是抽象地使用,只是传递给connect、bind、sendto、recvfrom等函数。不过,在这一点上,我们谈论的是风格和良好的编程实践,而不是每种语言的正确性


请注意,如果您只是想获取IPv6地址以便将其打印为字符串,则带有NI_NumeriHost标志的getnameinfo函数允许您以抽象方式执行此操作,而无需刺穿不透明结构sockaddr*

谢谢!在6中对sockaddr_进行强制转换以消除错误