Get ip address from hostname in C using Linux sockets
https://www.binarytides.com/hostname-to-ip-address-c-sockets-linux/
Get ip address from hostname in C using Linux sockets Google+
Socket applications often need to convert hostnames like google.com to their corresponding ip address. This is done through dns requests. The socket api in linux provides functions like gethostbyname and getaddrinfo that can be used to perform the dns requests and get the ip address.
gethostbyname The first method uses the traditional gethostbyname function to retrieve information about a hostname/domain name. Code #include<stdio.h> //printf #include<string.h> //memset #include<stdlib.h> //for exit(0); #include<sys/socket.h> #include<errno.h> //For errno - the error number #include //hostent #include<arpa/inet.h> int hostname_to_ip(char *
, char *);
int main(int argc , char *argv[]) { if(argc <2) { printf("Please provide a hostname to resolve"); exit(1); }
1 of 5
05/03/19, 1:02 am
Get ip address from hostname in C using Linux sockets
https://www.binarytides.com/hostname-to-ip-address-c-sockets-linux/
char *hostname = argv[1]; char ip[100]; hostname_to_ip(hostname , ip); printf("%s resolved to %s" , hostname , ip); printf("\n"); } /* Get ip from domain name */ int hostname_to_ip(char * hostname , char* ip) { struct hostent *he; struct in_addr **addr_list; int i; if ( (he = gethostbyname( hostname ) ) == NULL) { // get the host info herror("gethostbyname"); return 1; } addr_list = (struct in_addr **) he->h_addr_list; for(i = 0; addr_list[i] != NULL; i++) { //Return the first one; strcpy(ip , inet_ntoa(*addr_list[i]) ); return 0; } return 1; }
2 of 5
05/03/19, 1:02 am
Get ip address from hostname in C using Linux sockets
https://www.binarytides.com/hostname-to-ip-address-c-sockets-linux/
Compile and Run $ gcc hostname_to_ip.c && ./a.out www.google.com www.google.com resolved to 74.125.235.16 $ gcc hostname_to_ip.c && ./a.out www.msn.com www.msn.com resolved to 207.46.140.34 $ gcc hostname_to_ip.c && ./a.out www.yahoo.com www.yahoo.com resolved to 98.137.149.56
getaddrinfo The second method uses the getaddrinfo function to retrieve information about a hostname/domain name. The getaddrinfo supports ipv6 better. Code #include<stdio.h> //printf #include<string.h> //memset #include<stdlib.h> //for exit(0); #include<sys/socket.h> #include<errno.h> //For errno - the error number #include //hostent #include<arpa/inet.h> int hostname_to_ip(char *
, char *);
int main(int argc , char *argv[]) { if(argc <2) { printf("Please provide a hostname to resolve"); exit(1); } char *hostname = argv[1];
3 of 5
05/03/19, 1:02 am
Get ip address from hostname in C using Linux sockets
https://www.binarytides.com/hostname-to-ip-address-c-sockets-linux/
char ip[100]; hostname_to_ip(hostname , ip); printf("%s resolved to %s" , hostname , ip); printf("\n"); } /* Get ip from domain name */ int hostname_to_ip(char *hostname , char *ip) { int sockfd; struct addrinfo hints, *servinfo, *p; struct sockaddr_in *h; int rv; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; // use AF_INET6 to force IPv6 hints.ai_socktype = SOCK_STREAM; if ( (rv = getaddrinfo( hostname , "http" , &hints , &servinfo)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); return 1; } // loop through all for(p = servinfo; p { h = (struct strcpy(ip , }
the results and connect to the first we can != NULL; p = p->ai_next) sockaddr_in *) p->ai_addr; inet_ntoa( h->sin_addr ) );
freeaddrinfo(servinfo); // all done with this structure return 0;
4 of 5
05/03/19, 1:02 am
Get ip address from hostname in C using Linux sockets
https://www.binarytides.com/hostname-to-ip-address-c-sockets-linux/
}
Compile and Run $ gcc hostname_to_ip.c && ./a.out www.google.com www.google.com resolved to 74.125.235.19 $ gcc hostname_to_ip.c && ./a.out www.yahoo.com www.yahoo.com resolved to 72.30.2.43 $ gcc hostname_to_ip.c && ./a.out www.msn.com www.msn.com resolved to 207.46.140.34
Last Updated On : 19th November 2012
5 of 5
05/03/19, 1:02 am