我想創建一個簡單的程序,獲取IP地址給予一定的主機名:爲什麼getaddrinfo有多個結果?
我剪斷代碼附加如下:
#include<stdio.h>
#include<stdlib.h>
#include<stdio.h>
#include<netdb.h>
#include<sys/socket.h>
#include<errno.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>
int main(int argc, char *argv[]) {
if(argc<2){
printf("Please provide a hostname.\n");
exit(1);
}
char *hostname = argv[1];
char ip[100];
get_ip(hostname,ip);
printf("%s resolved to %s\n",hostname,ip);
}
int get_ip(char *hostname,char *ip){
struct sockaddr_in *h;
int sockfd;
struct addrinfo hints, *servinfo,*res;
struct addrinfo *iter;
int rv;
memset(&hints,0,sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if((rv = getaddrinfo(hostname,"http",&hints, &res))!=0){
fprintf(stderr, "getaddrinfo %s\n",gai_strerror(rv));
return 1;
}
for(iter=res;iter != NULL;iter=iter->ai_next){
printf("%p\n",iter->ai_next);
h=(struct sockaddr_in *)iter->ai_addr;
strcpy(ip,inet_ntoa(h->sin_addr));
printf("%s\n",ip);
}
freeaddrinfo(res);
return 0;
}
我在下面的參數輸入:
gcc get_ip_addr.c -o get_ip_addr;
./get_ip_addr google-public-dns-b.google.com
這導致:
0x2475330
8.8.4.4
(nil)
0.0.0.0
當我刪除了「http」和&提示,並將它們設置爲NULL我得到如下結果:
0x1b63310
8.8.4.4
0x1b63360
8.8.4.4
0x1b633b0
8.8.4.4
0x1b63410
0.0.0.0
0x1b63470
0.0.0.0
(nil)
0.0.0.0
所以,當我設置的服務,並提示爲NULL的getaddrinfo返回多個可能的結果,我不明白爲什麼我得到多個IP地址而不是隻獲得一個IP地址? 任何幫助將不勝感激!謝謝!
答案@fluter的摘要如下:主機名可以有多個IP地址。 –
一個IP地址可以有不同的配置,'getaddrinfo'返回地址配置而不是IP地址。 – fluter