Cette question peut être traitée comme une question sœur de Précédent posté par moi-même. Il est très fastidieux que lorsque vous souhaitez lier une adresse locale de liaison à une prise IPv6, vous devez définir le champ sin6_scope_id code> de la
sockaddr_in6 code> struct. Je me demande si quelqu'un peut fournir une solution après une bonne pratique. P>
3 Réponses :
Le problème ne se pose que lorsque vous devez coder une adresse locale de lien, ce qui n'est pas vraiment une solution pratique pour une application non triviale. P>
Sinon, vous devriez recevoir votre sockaddr code> pour lier de
geifaddrs () code>
, qui remplira l'identifiant de la portée pour vous (par exemple. Vous pouvez autoriser votre utilisateur à spécifier un nom d'interface, puis Recherche dans la liste renvoyée par geifaddrs () code> pour trouver l'adresse link-locale associée à cette interface). P>
L'adresse Link-Link IPv6 n'est pas unique sur le nœud, il n'est unique que pour la carte réseau, pourquoi vous devez spécifier l'identifiant de la portée. En d'autres termes, il est parfaitement valide pour avoir plusieurs adaptateurs avec exactement la même adresse IPv6. P>
Cela signifie que vous devez entrer en entrée dans l'identifiant de la portée ou le formulaire de texte approprié (% eth0,% 1) que vous pouvez passer à Une méthode consiste à prendre dans une adresse Link IPv6 Link-local, énumérer les interfaces et que seuls les allumettes utilisent cela, si plusieurs correspondances sont ensuite cautionnées avec une liste d'interfaces et permettent à l'utilisateur de spécifier lequel entier forme. p> gettaddrinfo () code>. p>.
L'adresse LINK-local est formée à partir de son préfixe de routage et de l'adresse MAC de l'interface. Donc, si plusieurs adaptateurs sont disponibles sur le même hôte, chaque adaptateur réseau a une adresse locale de liaison différente.
@ZIND Vous n'assumez pas de manière incorrecte à chaque interface d'une adresse MAC unique. Voir Sun Matériel pour un contre-exemple.
pour iPv6 link-link-adresses ( Fe80 :: / 10 code> préfixe), le
SIN6_SCOPE_ID CODE> membre dans la structure
sockaddr_in6 code> est le numéro d'interface et vous pouvez obtenir ce numéro par
if_nametoindex(const char *ifname);