2010-08-13 8 views
1

J'utilise getaddrinfo pour démarrer un serveur local accepter uniquement les connexions sur le localhost:getaddrinfo comportement incohérent

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); 

Cela semble fonctionner très bien, me donner l'adresse IPv6 :: 1 lorsque IPv6 est présent et IPv4 adresse quand ce n'est pas. Sauf parfois sur Windows 2008 R2 (du moins c'est le seul système où je l'ai vu, mais je l'ai vu deux fois, les deux fois sur un système client) il est lié à 127.0.0.1 au lieu d'IPv6!
Cela me gâche alors parce que si vous liez :: 1 il acceptera les deux connexions à 127.1 et à :: 1, mais si vous liez 127.1, alors les connexions IPv6 ne sont pas acceptées.

Répondre

3

getaddrinfo() renvoie une liste des adresses correspondantes, dans un ordre non spécifié. Vous devez parcourir la liste (en suivant le pointeur ai_next) et créer un socket d'écoute lié à chaque adresse renvoyée.

+0

Je ne sais pas .. Je ne suis pas convaincu. Je pensais que c'était OK pour écouter sur IPv6 et compter sur le fait que IPv4 sera également accepté (au-dessus de Windows 2003). Je fais une boucle à travers toutes les adresses quand je me connecte, mais pourquoi se baigner en acceptant? Je me rends compte que je vais devoir faire des changements car je ne peux pas compter sur l'adresse IPv6 étant le premier retourné. Ce que je veux comprendre, c'est ce qui fait que ce n'est pas le premier. Parce que tous les systèmes que j'ai construits ont d'abord IPv6, mais tous les systèmes que ce client construit ont d'abord l'IPv4. Il doit y avoir quelque chose dans la configuration. –

+0

@MK: C'est juste le moyen le plus fiable, c'est tout. Si vous préférez simplement écouter sur une adresse, vous pouvez parcourir la liste jusqu'à ce que vous trouviez la meilleure (probablement l'adresse 'AF_INET6' s'il y en a une). – caf

Questions connexes