Comment remplacer ioctl(SIOCGIFCONF) par if_nameindex() ?

Le
Olivier Miakinen
Bonjour,

Parmi les bouts de code qui ne fonctionneront plus en IPv6,
j'en ai un qui détermine la liste des adresses IP du hôte.
Ce code utilise ioctl(, SIOCGIFCONF, ) sur Unix, et
un contournement utilisant gethostname() et gethostbyname()
existe pour Windows.

Une recherche sur la toile me laisse supposer que je devrais
pouvoir m'en sortir avec if_nameindex(), mais le man de cette
fonction ne me permet que de trouver les noms et numéros des
interfaces, pas leur adresse IP (v4 ou v6). Est-ce que j'ai
loupé quelque chose ?

Cordialement,
--
Olivier Miakinen
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Erwan David
Le #24507821
Olivier Miakinen
Bonjour,

Parmi les bouts de code qui ne fonctionneront plus en IPv6,
j'en ai un qui détermine la liste des adresses IP du hôte.
Ce code utilise ioctl(..., SIOCGIFCONF, ...) sur Unix, et
un contournement utilisant gethostname() et gethostbyname()
existe pour Windows.

Une recherche sur la toile me laisse supposer que je devrais
pouvoir m'en sortir avec if_nameindex(), mais le man de cette
fonction ne me permet que de trouver les noms et numéros des
interfaces, pas leur adresse IP (v4 ou v6). Est-ce que j'ai
loupé quelque chose ?




Point à côté :

En posix gethostbyname est remplacé par getaddrinfo
http://en.wikipedia.org/wiki/Getaddrinfo

--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Olivier Miakinen
Le #24507841
Le 25/05/2012 20:23, Erwan David m'a répondu :

Une recherche sur la toile me laisse supposer que je devrais
pouvoir m'en sortir avec if_nameindex(), mais le man de cette
fonction ne me permet que de trouver les noms et numéros des
interfaces, pas leur adresse IP (v4 ou v6). Est-ce que j'ai
loupé quelque chose ?



Point à côté :

En posix gethostbyname est remplacé par getaddrinfo
http://en.wikipedia.org/wiki/Getaddrinfo



Certes, mais je ne vois nulle part où donner un numéro d'interface
dans cette fonction. Éventuellement ça pourrait être dans la
structure sockaddr_in6 (sin6_scope_id) de hints ? Si oui, est-ce
que je mets tout à 0 sauf sin6_scope_id, et sauf sin6_family que
je mets selon le cas à AF_INET ou AF_INET6 ?

Cordialement,
--
Olivier Miakinen
Erwan David
Le #24507871
Olivier Miakinen
Le 25/05/2012 20:23, Erwan David m'a répondu :

Une recherche sur la toile me laisse supposer que je devrais
pouvoir m'en sortir avec if_nameindex(), mais le man de cette
fonction ne me permet que de trouver les noms et numéros des
interfaces, pas leur adresse IP (v4 ou v6). Est-ce que j'ai
loupé quelque chose ?



Point à côté :

En posix gethostbyname est remplacé par getaddrinfo
http://en.wikipedia.org/wiki/Getaddrinfo



Certes, mais je ne vois nulle part où donner un numéro d'interface
dans cette fonction. Éventuellement ça pourrait être dans la
structure sockaddr_in6 (sin6_scope_id) de hints ? Si oui, est-ce
que je mets tout à 0 sauf sin6_scope_id, et sauf sin6_family que
je mets selon le cas à AF_INET ou AF_INET6 ?




Là je ne sais pas. Je mentionnais juste getaddrinfo (et getnameinfo)
parceque tu avais mentionné gethostbyname, obsolète maintenant.

--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Olivier Miakinen
Le #24507861
Le 25/05/2012 20:42, je répondais à Erwan David :

En posix gethostbyname est remplacé par getaddrinfo
http://en.wikipedia.org/wiki/Getaddrinfo



Certes, mais je ne vois nulle part où donner un numéro d'interface
dans cette fonction. Éventuellement ça pourrait être dans la
structure sockaddr_in6 (sin6_scope_id) de hints ? Si oui, est-ce
que je mets tout à 0 sauf sin6_scope_id, et sauf sin6_family que
je mets selon le cas à AF_INET ou AF_INET6 ?



Si j'en crois la doc, ça ne peut pas fonctionner car nodename et
servname ne peuvent pas être tous deux nuls. À moins qu'il n'y ait
une exception à cette règle si l'on précise un numéro d'interface
dans hints ?
Olivier Miakinen
Le #24507911
Le 25/05/2012 20:59, Erwan David a écrit :

En posix gethostbyname est remplacé par getaddrinfo
http://en.wikipedia.org/wiki/Getaddrinfo



Certes, mais je ne vois nulle part où donner un numéro d'interface
dans cette fonction. Éventuellement ça pourrait être dans la
structure sockaddr_in6 (sin6_scope_id) de hints ? Si oui, est-ce
que je mets tout à 0 sauf sin6_scope_id, et sauf sin6_family que
je mets selon le cas à AF_INET ou AF_INET6 ?



Là je ne sais pas. Je mentionnais juste getaddrinfo (et getnameinfo)
parceque tu avais mentionné gethostbyname, obsolète maintenant.



Ah, ok. De toute manière la méthode Windows avec gethostname() et
gethostbyname() n'était qu'une bidouille infâme, ne retournant qu'une
seule adresse, et encore, seulement s'il en existe une de même nom
que le nom de host (c'est souvent le cas, mais rien n'y oblige).

Donc, la question reste posée : comment obtenir les adresses IP
(v4 mais aussi v6) gérées par la machine sur laquelle on se trouve.

Cordialement,
--
Olivier Miakinen
xavier
Le #24507971
Olivier Miakinen
Donc, la question reste posée : comment obtenir les adresses IP
(v4 mais aussi v6) gérées par la machine sur laquelle on se trouve.



Mon script perl daily fait ça salement : il parse la sortie de
ipconfig /all

--
XAv
In your pomp and all your glory you're a poorer man than me,
as you lick the boots of death born out of fear.
(Jethro Tull)
Olivier Miakinen
Le #24507961
Le 25/05/2012 21:34, Xavier a écrit :

Donc, la question reste posée : comment obtenir les adresses IP
(v4 mais aussi v6) gérées par la machine sur laquelle on se trouve.



Mon script perl daily fait ça salement : il parse la sortie de
ipconfig /all



Ce sera ipconfig sur Windows, mais ifconfig sur Unix, et la sortie n'a
rien de normalisé.

Je viens de trouver une fonction getifaddrs() qui existe au moins sur
Linux, mais qui n'est malheureusement pas standard.
Je ne sais même pas si elle existe sur AIX, Sun et Windows.

:-(
Publicité
Poster une réponse
Anonyme