Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment remplacer ioctl(SIOCGIFCONF) par if_nameindex() ?

7 réponses
Avatar
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

7 réponses

Avatar
Erwan David
Olivier Miakinen <om+ écrivait :

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é
Avatar
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 ?

Cordialement,
--
Olivier Miakinen
Avatar
Erwan David
Olivier Miakinen <om+ écrivait :

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é
Avatar
Olivier Miakinen
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 ?
Avatar
Olivier Miakinen
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
Avatar
xavier
Olivier Miakinen <om+ wrote:

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)
Avatar
Olivier Miakinen
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.
<http://www.google.fr/search?hl=fr&q=getifaddrs+posix>.
Je ne sais même pas si elle existe sur AIX, Sun et Windows.

:-(