域名,ip相互转换(Linux,getaddrinfo, getnameinfo)

参考链接:

http://en.wikipedia.org/wiki/Getaddrinfo

代码:

 

01 /* ip_to_hostname ip */
02 #include <sys/types.h>
03 #include <sys/socket.h>
04 #include <netdb.h>
05 #include <unistd.h>
06 #include <stdio.h>
07 #include <stdlib.h>
08 #include <string.h>
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 <sys/types.h>
03 #include <sys/socket.h>
04 #include <netdb.h>
05 #include <unistd.h>
06 #include <stdio.h>
07 #include <stdlib.h>
08 #include <string.h>
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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值