2010-08-13 54 views
1

我使用的getaddrinfo啓動本地服務器僅在本地主機接受連接:的getaddrinfo不一致的行爲

struct addrinfo *res; 
struct addrinfo hints = {0}; 
hints.ai_family = AF_UNSPEC; 
hints.ai_socktype = SOCK_STREAM; 
hints.ai_protocol = IPPROTO_TCP; 
getaddrinfo(NULL, portbuf, &hints, &res); 

這似乎做工精細,給我的IPv6地址:: 1,當IPv6是當前和IPv4地址不在時。
除了有時在Windows 2008 R2上(至少這是我見過它的唯一系統,但我看到它兩次,兩次都在客戶系統上),它將綁定到1​​27.0.0.1而不是IPv6!
這會讓我迷惑,因爲如果綁定:: 1,它將同時接受127.1和:: 1,但是如果綁定127.1,那麼IPv6連接將不被接受。

回答

3

getaddrinfo()返回一個列表匹配地址,以未指定的順序。您應該遍歷該列表(在ai_next指針後面),然後創建一個綁定到每個返回地址的偵聽套接字。

+0

不知道..我不相信。我認爲只聽IPv6並且依靠IPv4也會被接受(在Windows 2003之上)是可以的。當我連接時,我會遍歷所有地址,但爲什麼在接受時會出現問題? 我意識到我將不得不作出更改,因爲我不能依靠IPv6地址成爲第一個返回的地址。我想了解的是導致它不是第一個的原因。由於我建立的所有系統都具有IPv6,但該客戶建立的所有系統都是先獲得IPv4。配置中必須有一些東西。 – 2010-08-13 16:01:16

+0

@MK:這只是最可靠的方式,就是這樣。如果你只想聽一個地址,你可以遍歷列表,直到找到最好的一個(大概是'AF_INET6'地址,如果有的話)。 – caf 2010-08-14 05:17:49