Question

Cette question peut être traitée comme une question sœur de précédent un posté par moi-même. Il est très fastidieux que lorsque vous voulez lier une adresse locale de liaison à une prise IPv6, vous devez définir le champ sin6_scope_id de la struct sockaddr_in6. Je me demande si quelqu'un peut fournir une solution conforme aux bonnes pratiques.

Était-ce utile?

La solution

L'adresse de liaison locale IPv6 n'est pas unique sur le nœud, il est seulement unique pour la carte réseau qui est la raison pour laquelle vous devez spécifier le champ-id. En d'autres termes, il est tout à fait valable d'avoir plusieurs cartes avec exactement la même adresse IPv6.

Cela signifie que vous devez prendre en entrée le champ id ou sous forme de texte approprié (% eth0,% 1) que vous pouvez passer à getaddrinfo().

Une méthode consiste à prendre une adresse de liaison locale IPv6, énumérer les interfaces et si seulement un rapport entre la consommation que, si plus d'un match, puis la libération sous caution avec une liste d'interfaces et d'obtenir l'utilisateur pour spécifier une en pleine formulaire.

Autres conseils

La question ne se pose que lorsque vous coder en dur un lien adresse locale, ce qui est pas vraiment une solution pratique pour une application non triviale.

Dans le cas contraire, vous devriez obtenir votre sockaddr pour lier getifaddrs() , qui remplira l'identifiant de portée pour vous (par exemple., vous pouvez permettre à votre utilisateur de spécifier un nom d'interface, puis recherchez dans la liste renvoyée par getifaddrs() pour trouver l'adresse de liaison locale associée à cette interface).

Pour les adresses IPv6 lien-local (préfixe fe80::/10), l'organe de sin6_scope_id dans la structure de sockaddr_in6 est le numéro d'interface et vous pouvez obtenir ce nombre par

if_nametoindex(const char *ifname);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top