Get ip address from hostname in C using Linux sockets
发布日期:2021-08-31 13:48:47 浏览次数:13 分类:技术文章

本文共 3271 字,大约阅读时间需要 10 分钟。

Here are 2 methods to get the ip address of a hostname :

The first method uses the traditional gethostbyname function to retrieve information about a hostname/domain name.

Code

1 #include<stdio.h> //printf
2 #include<string.h> //memset
3 #include<stdlib.h> //for exit(0);
4 #include<sys/socket.h>
5 #include<errno.h> //For errno - the error number
6 #include<netdb.h> //hostent
7 #include<arpa/inet.h>
8  
9 int hostname_to_ip(char *  , char *);
10  
11 int main(int argc , char *argv[])
12 {
13     if(argc <2)
14     {
15         printf("Please provide a hostname to resolve");
16         exit(1);
17     }
18      
19     char *hostname = argv[1];
20     char ip[100];
21      
22     hostname_to_ip(hostname , ip);
23     printf("%s resolved to %s" , hostname , ip);
24      
25     printf("\n");
26      
27 }
28 /*
29     Get ip from domain name
30  */
31  
32 int hostname_to_ip(char * hostname , char* ip)
33 {
34     struct hostent *he;
35     struct in_addr **addr_list;
36     int i;
37          
38     if ( (he = gethostbyname( hostname ) ) == NULL)
39     {
40         // get the host info
41         herror("gethostbyname");
42         return 1;
43     }
44  
45     addr_list = (struct in_addr **) he->h_addr_list;
46      
47     for(i = 0; addr_list[i] != NULL; i++)
48     {
49         //Return the first one;
50         strcpy(ip , inet_ntoa(*addr_list[i]) );
51         return 0;
52     }
53      
54     return 1;
55 }

Compile and Run

1 $ gcc hostname_to_ip.c && ./a.out www.google.com
2 www.google.com resolved to 74.125.235.16
3  
4 $ gcc hostname_to_ip.c && ./a.out www.msn.com
5 www.msn.com resolved to 207.46.140.34
6  
7 $ gcc hostname_to_ip.c && ./a.out www.yahoo.com
8 www.yahoo.com resolved to 98.137.149.56

The second method uses the getaddrinfo function to retrieve information about a hostname/domain name.

Code

1 #include<stdio.h> //printf
2 #include<string.h> //memset
3 #include<stdlib.h> //for exit(0);
4 #include<sys/socket.h>
5 #include<errno.h> //For errno - the error number
6 #include<netdb.h> //hostent
7 #include<arpa/inet.h>
8  
9 int hostname_to_ip(char *  , char *);
10  
11 int main(int argc , char *argv[])
12 {
13     if(argc <2)
14     {
15         printf("Please provide a hostname to resolve");
16         exit(1);
17     }
18      
19     char *hostname = argv[1];
20     char ip[100];
21      
22     hostname_to_ip(hostname , ip);
23     printf("%s resolved to %s" , hostname , ip);
24      
25     printf("\n");
26      
27 }
28 /*
29     Get ip from domain name
30  */
31  
32 int hostname_to_ip(char *hostname , char *ip)
33 {
34     int sockfd; 
35     struct addrinfo hints, *servinfo, *p;
36     struct sockaddr_in *h;
37     int rv;
38  
39     memset(&hints, 0, sizeof hints);
40     hints.ai_family = AF_UNSPEC; // use AF_INET6 to force IPv6
41     hints.ai_socktype = SOCK_STREAM;
42  
43     if ( (rv = getaddrinfo( hostname , "http" , &hints , &servinfo)) != 0)
44     {
45         fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
46         return 1;
47     }
48  
49     // loop through all the results and connect to the first we can
50     for(p = servinfo; p != NULL; p = p->ai_next)
51     {
52         h = (struct sockaddr_in *) p->ai_addr;
53         strcpy(ip , inet_ntoa( h->sin_addr ) );
54     }
55      
56     freeaddrinfo(servinfo); // all done with this structure
57     return 0;
58 }

Compile and Run

1 $ gcc hostname_to_ip.c && ./a.out www.google.com
2 www.google.com resolved to 74.125.235.19
3  
4 $ gcc hostname_to_ip.c && ./a.out www.yahoo.com
5 www.yahoo.com resolved to 72.30.2.43
6  
7 $ gcc hostname_to_ip.c && ./a.out www.msn.com
8 www.msn.com resolved to 207.46.140.34

转载地址:https://blog.csdn.net/weixin_34077371/article/details/90663146 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:《Netty 权威指南》—— NIO创建的TimeServer源码分析
下一篇:iOS仿今日头条滑动导航

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月27日 14时27分34秒