Ajout de la prise en charge d’IPv6 dans les applications client / serveur IPv4 – Champs sin6_flowinfo et sin6_scope_id?

Je travaille sur la mise en œuvre du support IPv6 pour plusieurs applications, mais je me demandais à quoi servent ces 2 champs. Il y a si peu de questions à ce sujet ici, donc je ne suis pas sûr d’avoir bien compris.

  • À propos de l’ID de scope ( sin6_scope_id ) – eh bien, Q1 , Q2 , Q3 et Q4 m’ont donné une idée de l’ID de scope et je pense l’avoir. Donc, je vais devoir append un paramètre de configuration supplémentaire pour rendre le scope-id configurable. (J’ai décidé d’append ceci ici, au cas où quelqu’un s’y intéresserait). En bref, un identificateur d’étendue est nécessaire pour déterminer de manière unique quel est le périphérique, qui doit gérer le trafic, car il peut y avoir plusieurs interfaces, avec la même adresse IP, mais avec un ID (interface?) Différent. Jusqu’ici tout va bien.
  • Mais qu’en est-il des “informations de stream” ( sin6_flowinfo )
    • Pourquoi est-ce? Je n’ai rien trouvé d’intéressant à ce sujet. J’ai lu le RFC mais cela ne m’a pas aidé du tout.
    • Existe-t-il des valeurs possibles pour sin6_flowinfo (comme – plusieurs valeurs, comme des indicateurs, qui signifient quelque chose) ou semblables au sin6_scope_id – peuvent être n’importe quelle valeur, en fonction du périphérique sin6_scope_id j’essaie de me connecter?
    • Devrais-je m’inquiéter du tout, ou je la laisse simplement 0 (comme dans le Guide de Beej sur la programmation réseau . Et oui , j’ai essayé, ça marche, mais je ne suis pas sûr que ça marche seulement dans ce cas (si dépend de la configuration du réseau) ou cela fonctionnera-t-il toujours s’il est défini sur 0 ?
    • Ou peut-être que je devrais le rendre configurable, je veux dire – append une option de configuration supplémentaire et laisser l’utilisateur définir sa valeur?
    • google -ing “sin6_flowinfo” me donne des définitions de structure et des pages de manuel, rien d’utile sur ce champ. Une source intéressante? (compréhensible..pas RFC: D)

EDIT : Eh bien, après la réponse de @glglgl et après le conseil, que sin6_flowinfo soit peut-être obsolète, j’ai trouvé des sources intéressantes: RFC: spécification d’étiquette de stream IPv6 , brouillon IETF: étiquette de stream en tant que couche de transport , guide pratique pour solaris et Wikipédia .
Le champ n’est pas obsolète (ou je ne pouvais pas trouver une telle source qui le confirme), mais cela ressemble à 0 car la valeur est suffisante.

La meilleure solution consiste à utiliser getaddrinfo() .

Pseudo code:

 struct addrinfo *ressortingct hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM }; struct addrinfo * res, r; if (0 == getaddrinfo("foo.bar.baz", "http", &hints, &res)) { for (r=res; r; r=r->ai_next) { sock = socket(r->ai_family, r->ai_socktype, r->ai_protocol); connect(sock, r->ai_addr, r->ai_addrlen); if error: continue break } } freeaddrinfo(res); 

Cela vous évitera l’inquiétude concernant sin6_scope_id . qui est normalement 0 , sauf si vous avez des adresses de liens locaux comme fe80::1234:56ff:fe78:9abc%eth2 . Cet eth2 est converti en l’ID d’étendue correct.

sin6_flowinfo est obsolète (autant que je sache) et a donc la valeur 0 dans le struct addrinfo votre struct addrinfo ai_addr .