10
votes

Comment lier une adresse locale de liaison à une prise IPv6

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 de la sockaddr_in6 struct. Je me demande si quelqu'un peut fournir une solution après une bonne pratique.


0 commentaires

3 Réponses :


3
votes

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.

Sinon, vous devriez recevoir votre sockaddr pour lier de geifaddrs () , 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 () pour trouver l'adresse link-locale associée à cette interface).


0 commentaires

13
votes

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.

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 à gettaddrinfo () . .

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.


2 commentaires

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.



3
votes

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


0 commentaires