我一直在学习一个关于如何为 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") 填充到hostname中。
发生的事情是strlen 拒绝给我任何东西(我知道strdup是如何工作的,我自己已经测试过了)和段错误。我使用过 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怎么了?