Я работал над небольшим учебным пособием по созданию базового анализатора пакетов для Linux.У меня все работает, и теперь я хочу добавить сопоставление IP-адреса с хостом.
Все работало до того, как я добавил эту функцию:
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);
}
Это в основном берет строковый IP-адрес ("192.168.28.18") ipaddress и заполняет эти IP-адресаимя хоста ("who.cares.com") в имя хоста .
Что происходит, когда strlen ОТКАЗЫВАЕТСЯ , чтобы дать мне что-нибудь (я знаюкак работает strdup , и я сам это проверял) и segfaults.Я использовал GDB, и строка оканчивается нулевым символом, и это не NULL.
Я также тестировал использование необработанного назначения строки со статической структурой:
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;
}
И до сих пор нет игры в кости.
Итак, что случилось с strlen ?