2017-07-27 66 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