inet_ntop 反复循环IP
inet_ntop repeatedly looping IP
我正在尝试构建一个工具来根据域名收集有关 IP 地址的信息。我一直在使用 inet_ntop 来实现这一点,并且通常在大多数域中都运行良好。当我在 google.com 或 amazon.com 等网站上尝试时,似乎重复打印了相同的 IP 地址。
示例输出:
主持人:google.com
IPv4:54.239.17.6
IPv4:54.239.17.6
IPv4:54.239.17.6
IPv4:54.239.17.6
IPv4:54.239.17.6
IPv4:54.239.17.6
....
我想知道是否有人遇到过这种情况,是我做错了什么还是这与网站的配置方式有关。
error = getaddrinfo(domain, "80", &host_info, &host_list);
// if error exists exit gracefully
if(error != 0)
{
print_conn_err(error);
return EXIT_FAILURE;
}
// print the domain string array
printf("Host: %s\n", domain);
// print IP addresses relating to domain name
printf("IP Address(s):\n");
for(result = host_list; result != NULL; result = host_list->ai_next)
{
void * address;
char * ip_version;
// if result is IPv4 address
if(result->ai_family == AF_INET)
{
struct sockaddr_in * ipv4 = (struct sockaddr_in *)result->ai_addr;
address = &(ipv4->sin_addr);
ip_version = "IPv4";
}
else if(result->ai_family == AF_INET6)
{
struct sockaddr_in6 * ipv6 = (struct sockaddr_in6 *)result->ai_addr;
address = &(ipv6->sin6_addr);
ip_version = "IPv6";
}
else
{
printf("%s", "Not a valid IP addresses \n.");
return EXIT_FAILURE;
}
// convert the IP to a string and print it:
inet_ntop(result->ai_family, address, ip_address, sizeof ip_address);
printf(" %s: %s\n", ip_version, ip_address);
}
freeaddrinfo(result);
我想到的一个想法是用以前的IP检查当前IP并打破循环。不过,这似乎是一个很老套的解决方案。
您的代码中存在错误导致了此问题。
for(result = host_list; result != NULL; result = host_list->ai_next)
需要
for(result = host_list; result != NULL; result = result->ai_next)
你的freeaddrinfo(result)
也必须改成freeaddrinfo(host_list)
我正在尝试构建一个工具来根据域名收集有关 IP 地址的信息。我一直在使用 inet_ntop 来实现这一点,并且通常在大多数域中都运行良好。当我在 google.com 或 amazon.com 等网站上尝试时,似乎重复打印了相同的 IP 地址。
示例输出: 主持人:google.com IPv4:54.239.17.6 IPv4:54.239.17.6 IPv4:54.239.17.6 IPv4:54.239.17.6 IPv4:54.239.17.6 IPv4:54.239.17.6 ....
我想知道是否有人遇到过这种情况,是我做错了什么还是这与网站的配置方式有关。
error = getaddrinfo(domain, "80", &host_info, &host_list);
// if error exists exit gracefully
if(error != 0)
{
print_conn_err(error);
return EXIT_FAILURE;
}
// print the domain string array
printf("Host: %s\n", domain);
// print IP addresses relating to domain name
printf("IP Address(s):\n");
for(result = host_list; result != NULL; result = host_list->ai_next)
{
void * address;
char * ip_version;
// if result is IPv4 address
if(result->ai_family == AF_INET)
{
struct sockaddr_in * ipv4 = (struct sockaddr_in *)result->ai_addr;
address = &(ipv4->sin_addr);
ip_version = "IPv4";
}
else if(result->ai_family == AF_INET6)
{
struct sockaddr_in6 * ipv6 = (struct sockaddr_in6 *)result->ai_addr;
address = &(ipv6->sin6_addr);
ip_version = "IPv6";
}
else
{
printf("%s", "Not a valid IP addresses \n.");
return EXIT_FAILURE;
}
// convert the IP to a string and print it:
inet_ntop(result->ai_family, address, ip_address, sizeof ip_address);
printf(" %s: %s\n", ip_version, ip_address);
}
freeaddrinfo(result);
我想到的一个想法是用以前的IP检查当前IP并打破循环。不过,这似乎是一个很老套的解决方案。
您的代码中存在错误导致了此问题。
for(result = host_list; result != NULL; result = host_list->ai_next)
需要
for(result = host_list; result != NULL; result = result->ai_next)
你的freeaddrinfo(result)
也必须改成freeaddrinfo(host_list)