参考链接:
http://en.wikipedia.org/wiki/Getaddrinfo
代码:
01
/* ip_to_hostname ip */
02
#include
03
#include
04
#include
05
#include
06
#include
07
#include
08
#include
09
10
int main(int argc,char *argv[])
11
{
12
if (argc != 2)
13
{
14
fprintf(stderr,"Usage: %s hostname\n", argv[0]);
15
exit(EXIT_FAILURE);
16
}
17
struct addrinfo hints;
18
struct addrinfo *result, *result_pointer;
19
int ret;
20
/* obtaining address matching host */
21
memset(&hints, 0,sizeof(struct addrinfo));
22
hints.ai_family = AF_UNSPEC;
23
hints.ai_socktype = SOCK_STREAM;
24
hints.ai_flags = AI_CANONNAME | AI_NUMERICHOST;
25
hints.ai_protocol = 0;/* any protocol */
26
27
// ret = getaddrinfo(argv[1], NULL, &hints, &result);
28
ret = getaddrinfo(argv[1], NULL, &hints, &result);
29
if (ret != 0)
30
{
31
fprintf(stderr,"getaddrinfo: %s\n", gai_strerror(ret));
32
exit(EXIT_FAILURE);
33
}
34
/* traverse the returned list and output the ip addresses */
35
for (result_pointer = result; result_pointer != NULL; result_pointer = result_pointer->ai_next)
36
{
37
char hostname[1025] ="";
38
ret = getnameinfo(result_pointer->ai_addr, result_pointer->ai_addrlen, hostname,sizeof(hostname), NULL, 0, NI_NAMEREQD);
39
if (ret != 0)
40
{
41
fprintf(stderr,"error in getnameinfo: %s \n", gai_strerror(ret));
42
}
43
else
44
{
45
printf("hostname: %s \n", hostname);
46
}
47
// printf("hostname: %s \n", result_pointer->ai_canonname);
48
}
49
freeaddrinfo(result);
50
exit(EXIT_SUCCESS);
51
}
01
/* hostname_to_ip hostname */
02
#include
03
#include
04
#include
05
#include
06
#include
07
#include
08
#include
09
10
int main(int argc,char *argv[])
11
{
12
if (argc != 2)
13
{
14
fprintf(stderr,"Usage: %s hostname\n", argv[0]);
15
exit(EXIT_FAILURE);
16
}
17
struct addrinfo hints;
18
struct addrinfo *result, *result_pointer;
19
int ret;
20
/* obtaining address matching host */
21
memset(&hints, 0,sizeof(struct addrinfo));
22
hints.ai_family = AF_UNSPEC;
23
hints.ai_socktype = SOCK_STREAM;
24
hints.ai_flags = AI_CANONNAME;
25
hints.ai_protocol = 0;/* any protocol */
26
27
// ret = getaddrinfo(argv[1], NULL, &hints, &result);
28
ret = getaddrinfo(argv[1], NULL, &hints, &result);
29
if (ret != 0)
30
{
31
fprintf(stderr,"getaddrinfo: %s\n", gai_strerror(ret));
32
exit(EXIT_FAILURE);
33
}
34
/* traverse the returned list and output the ip addresses */
35
for (result_pointer = result; result_pointer != NULL; result_pointer = result_pointer->ai_next)
36
{
37
char hostname[1025] ="";
38
ret = getnameinfo(result_pointer->ai_addr, result_pointer->ai_addrlen, hostname,sizeof(hostname), NULL, 0, NI_NUMERICHOST);
39
if (ret != 0)
40
{
41
fprintf(stderr,"error in getnameinfo: %s \n", gai_strerror(ret));
42
continue;
43
}
44
else
45
{
46
printf("IP: %s \n", hostname);
47
}
48
}
49
freeaddrinfo(result);
50
exit(EXIT_SUCCESS);
51
}
结果:
root@localhost :/home/James/mypro/Linux-Pro/Network# ./hostname_to_ip baidu.com
IP: 123.125.114.144
IP: 220.181.111.85
IP: 220.181.111.86
root@localhost :/home/James/mypro/Linux-Pro/Network# ./ip_to_hostname 220.181.111.86
error in getnameinfo: Name or service not known
root@localhost :/home/James/mypro/Linux-Pro/Network# ./ip_to_hostname 10.0.0.78
hostname: localhost
root@localhost:/home/James/mypro/Linux-Pro/Network# ./ip_to_hostname 59.66.137.62
hostname: th137062.ip.tsinghua.edu.cn
root@localhost:/home/James/mypro/Linux-Pro/Network# ./ip_to_hostname 202.106.182.229
hostname: mail182-229.sinamail.sina.com.cn
root@localhost:/home/James/mypro/Linux-Pro/Network# ./ip_to_hostname 211.147.4.7
hostname: mail3.douban.com