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

gethostbyname()

8 réponses
Avatar
JKB
Bonjour à tous,

Je suis en train de modifier un programme pour qu'il puisse tourner
sous OS/2. Le programme de base utilise getaddrinfo et fonctionne
parfaitement.

Sous OS/2, j'ai accès aux fonctions BSD comme gethostbyname() mais
je ne comprends pas leur fonctionnement. Je viens de relire
plusieurs fois la doc sans succès.

Exemple minimal :

nclude <stdio.h>
#include <stdlib.h>
#include <netdb.h>

int
main()
{
struct hostent *t;
int i;

t = gethostbyname("nom de la machine en 192.168.0.128");

printf("%p\n", t);
herror("");
printf("%s\n", t->h_name);
printf("%d\n", t->h_length);
printf("%d\n", t->h_addrtype);

i = 0;

while(t->h_aliases[i] != NULL)
{
printf("%X ", t->h_aliases[i++]);
}

i = 0;

while(t->h_addr_list[i] != NULL)
{
printf("%X ", t->h_addr_list[i++]);
}

printf("\n");

t = gethostbyname("192.168.0.128");

printf("%p\n", t);
herror("");
printf("%s\n", t->h_name);
printf("%d\n", t->h_length);
printf("%d\n", t->h_addrtype);

i = 0;

while(t->h_aliases[i] != NULL)
{
printf("%X ", t->h_aliases[i++]);
}

i = 0;

while(t->h_addr_list[i] != NULL)
{
printf("%X ", t->h_addr_list[i++]);
}

printf("\n");
}

L'exécution de ce programme me donne :

cauchy:[/tmp] > ./a.out
0x7f56fbfd8600
Unknown host
nom de la machine en 192.168.0.128 (naturellement, il s'agit d'un fqdn)
4
2
6011E4
0x7f56fbfd8600
Unknown host
192.168.0.128
4
2
601010
cauchy:[/tmp] >

Ce que je ne comprends pas : pourquoi les deux adresses ipv4
sont-elles différentes ? Par le nom, j'obtiens 6011E4, par d'adresse
IP, j'obtiens 601010. Je cherche à récupérer l'adresse IPv4,
celle-ci devrait être la même. J'ai certainement dû rater un truc,
mais je ne vois pas.

Par ailleurs, à partir d'OS/2 (eComStation 2.0), j'obtiens deux
résultats différents, ce qui est gênant.

Une idée ?

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
=> http://grincheux.de-charybde-en-scylla.fr

8 réponses

Avatar
xavier
JKB wrote:

Une idée ?



Visiblement, sous MacOSX [ uname -a -> Darwin enterprise.groumpf.org
10.4.0 Darwin Kernel Version 10.4.0; gcc --version ->
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659) ]
les r&sultats sont semblables :

Program loaded.
run
[Switching to process 4032]
Running...
0x100100cf0
Resolver Error 0 (no error)
enterprise.groumpf.org
4
2
100D47
------------------
0x100100e50
Resolver Error 0 (no error)
192.168.100.11
4
2
100E9F

J'avoue n'y rien comprendre non plus. Mais je me demande si
gethostbyname est bien approprié pour une résolution inverse...

Note que si je change le milieu de ton code par :
inet_aton("192.168.100.11",&a);
t = gethostbyaddr(&a, sizeof (struct in_addr), AF_INET);

J'obtiens un résultat encore différent :

run
[Switching to process 4373]
Running...
0x100100cf0
Resolver Error 0 (no error)
enterprise.groumpf.org
4
2
100D47
------------------
0x100100ed0
Resolver Error 0 (no error)
enterprise.groumpf.org
4
2
100F1F 100F4B

Note que je vois pas bien ce qu'il y a dans les champs
t->h_addr_list[i++].

Pour mon cas, je devrais avoir C0A8640B. Ou j'ai mal lu la page man...


--
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.
Avatar
JKB
Le Tue, 3 Aug 2010 13:50:13 +0200,
Xavier écrivait :
JKB wrote:

Une idée ?



Visiblement, sous MacOSX [ uname -a -> Darwin enterprise.groumpf.org
10.4.0 Darwin Kernel Version 10.4.0; gcc --version ->
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659) ]
les r&sultats sont semblables :

Program loaded.
run
[Switching to process 4032]
Running...
0x100100cf0
Resolver Error 0 (no error)
enterprise.groumpf.org
4
2
100D47
------------------
0x100100e50
Resolver Error 0 (no error)
192.168.100.11
4
2
100E9F

J'avoue n'y rien comprendre non plus. Mais je me demande si
gethostbyname est bien approprié pour une résolution inverse...

Note que si je change le milieu de ton code par :
inet_aton("192.168.100.11",&a);
t = gethostbyaddr(&a, sizeof (struct in_addr), AF_INET);

J'obtiens un résultat encore différent :

run
[Switching to process 4373]
Running...
0x100100cf0
Resolver Error 0 (no error)
enterprise.groumpf.org
4
2
100D47
------------------
0x100100ed0
Resolver Error 0 (no error)
enterprise.groumpf.org
4
2
100F1F 100F4B

Note que je vois pas bien ce qu'il y a dans les champs
t->h_addr_list[i++].

Pour mon cas, je devrais avoir C0A8640B. Ou j'ai mal lu la page man...



Nous sommes donc d'accord et sommes deux à ne pas comprendre. Entre
temps, j'ai trouvé une implantation de getaddrinfo()...

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Nicolas George
JKB wrote in message :
Exemple minimal :



J'ai beaucoup de mal à lire la sortie de ton exemple. Est-ce que tu pourrais
refaire la même chose avec :

printf("%sn", t->h_name);



printf("name = %sn", t->h_name);

printf("%X ", t->h_aliases[i++]);



Les alias sont censés être des chaînes de caractères. Tu comprendrais
probablement mieux ce qui se passe avec :

printf("alias[%d] = %sn", i, t->h_aliases[i]);

printf("%X ", t->h_addr_list[i++]);



Ici, ce sont des adresses IP, donc il faudrait probablement écrire quelque
chose comme :

printf("addr_list[%d] = %d.%d.%d.%dn",
(unsigned char)t->h_addr_list[i][0],
(unsigned char)t->h_addr_list[i][1],
(unsigned char)t->h_addr_list[i][2],
(unsigned char)t->h_addr_list[i][3]);
Avatar
JKB
Le 03 Aug 2010 12:03:32 GMT,
Nicolas George <nicolas$ écrivait :
JKB wrote in message :
Exemple minimal :



J'ai beaucoup de mal à lire la sortie de ton exemple. Est-ce que tu pourrais
refaire la même chose avec :

printf("%sn", t->h_name);



printf("name = %sn", t->h_name);

printf("%X ", t->h_aliases[i++]);



Les alias sont censés être des chaînes de caractères. Tu comprendrais
probablement mieux ce qui se passe avec :

printf("alias[%d] = %sn", i, t->h_aliases[i]);

printf("%X ", t->h_addr_list[i++]);



Ici, ce sont des adresses IP, donc il faudrait probablement écrire quelque
chose comme :

printf("addr_list[%d] = %d.%d.%d.%dn",
(unsigned char)t->h_addr_list[i][0],
(unsigned char)t->h_addr_list[i][1],
(unsigned char)t->h_addr_list[i][2],
(unsigned char)t->h_addr_list[i][3]);



Gagné. Problème d'alignement. Bon, je vais me cacher...

Merci.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
xavier
JKB wrote:

Nous sommes donc d'accord et sommes deux à ne pas comprendre. Entre
temps, j'ai trouvé une implantation de getaddrinfo()...



Les modifications suggérées par Nicolas semblent fructueuses :

run
[Switching to process 5287]
Running...
pointer = 0x100100cf0
Resolver Error 0 (no error)
name = enterprise.groumpf.org
lenght = 4
type = 2
addr_list[0] = 192.168.100.11

------------------
pointer = 0x100100e50
Resolver Error 0 (no error)
name = 192.168.100.11
lenght = 4
type = 2
addr_list[0] = 192.168.100.11

--
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.
Avatar
JKB
Le Tue, 3 Aug 2010 15:16:20 +0200,
Xavier écrivait :
JKB wrote:

Nous sommes donc d'accord et sommes deux à ne pas comprendre. Entre
temps, j'ai trouvé une implantation de getaddrinfo()...



Les modifications suggérées par Nicolas semblent fructueuses :

run
[Switching to process 5287]
Running...
pointer = 0x100100cf0
Resolver Error 0 (no error)
name = enterprise.groumpf.org
lenght = 4
type = 2
addr_list[0] = 192.168.100.11

------------------
pointer = 0x100100e50
Resolver Error 0 (no error)
name = 192.168.100.11
lenght = 4
type = 2
addr_list[0] = 192.168.100.11



J'ai vu, je ne devrais jamais lire de la doc quand je suis fatigué.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
xavier
JKB wrote:

J'ai vu, je ne devrais jamais lire de la doc quand je suis fatigué.



Et moi, je devrais lire deux fois le code avant de le compiler, parce
que le coup du tableau de bytes pour l'adresse, j'ai l'ai utilisé bien
souvent auparavant.

--
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.
Avatar
JKB
Le Tue, 3 Aug 2010 16:31:13 +0200,
Xavier écrivait :
JKB wrote:

J'ai vu, je ne devrais jamais lire de la doc quand je suis fatigué.



Et moi, je devrais lire deux fois le code avant de le compiler, parce
que le coup du tableau de bytes pour l'adresse, j'ai l'ai utilisé bien
souvent auparavant.



Tu n'es le seul...

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
=> http://grincheux.de-charybde-en-scylla.fr