J'ai travaillé à un petit tutoriel sur la façon de construire un sniffer de base pour Linux. J'ai tout réussi, et je veux maintenant ajouter le mapping IP-to-host.strlen() Refuse de lire la chaîne de struct hostent *
Tout fonctionnait avant ajouté cette fonction:
void IPtoHostname(char *ipaddress, char *hostname){
struct hostent *host;
in_addr_t ip = inet_addr(ipaddress);
if (!hostname){
puts("Can't allocate memory...");
exit(-1);
}
host = gethostbyaddr((char *)&ip, 32, AF_INET);
hostname = strdup(host->h_name);
}
Cela prend essentiellement une adresse IP de chaîne ("192.168.28.18") ipaddress et Remplit que le nom d'hôte IP ("who.cares.com ") dans nom d'hôte.
Qu'est-ce qui se passe est que strlenREFUSE me donner quoi que ce soit (je sais strdup œuvres, et je l'ai testé moi-même) et segfaults. J'ai utilisé GDB, et la chaîne se termine par un caractère nul et ce n'est pas NULL.
J'ai également testé à l'aide d'une affectation de chaîne brute avec une struct statique:
void IPtoHostname(char *ipaddress, char *hostname){
static struct hostent *host;
in_addr_t ip = inet_addr(ipaddress);
if (!hostname){
puts("Can't allocate memory...");
exit(-1);
}
host = gethostbyaddr((char *)&ip, 32, AF_INET);
hostname = host->h_name;
}
Et toujours pas de dés. Donc, quoi de neuf strlen?
L'erreur est probablement dans le code qui appelle cette fonction, comme suggéré par la réponse de George. Dans un futur post a [MCVE] (http://stackoverflow.com/help/mcve) –