J'écris un programme qui vérifierait si un port sur url ou ip donné est ouvert ou non. Afin d'obtenir l'adresse IP de l'URL donnée, j'utilise gethostbyname()
. Lorsque vous essayez de rechercher l'adresse de localhost, elle renvoie la valeur correcte, mais en essayant de rechercher l'adresse d'un hôte distant, elle échoue généralement et renvoie une adresse IP avec des nombres négatifs. Par exemple:gethostbyname() renvoie une structure avec l'adresse négative
/test.out google.com
ip: -40.58.-42.78
/test.out reddit.com
ip: -105.101.-127.-116
./test.out facebook.com
ip: 31.13.84.36
Bizarrement, le dernier fonctionne. Voici mon code:
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
int main(int argc, char **argv)
{
struct hostent *he;
struct in_addr **addr_list;
if ((he = gethostbyname(argv[1])) == NULL) {
herror("gethostbyname");
return 1;
}
printf("ip: ");
for (int i = 0; i < he->h_length; i++) {
printf("%d", he->h_addr_list[0][i]);
if (i != he->h_length - 1) printf(".");
}
printf("\n");
}
Aussi, pourquoi est le type de h_addr_list
char **
? Ne devrait-il pas être un nombre entier, ou même mieux un non signé?
Vous essayez probablement d'imprimer des chaînes. –
Utilisez la fonction 'inet_ntoa' pour convertir l'adresse en chaîne, plutôt que de la coder vous-même. – Barmar