#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 100
/*
* Name resolution through getaddrinfo() calls.
*/
int main(int argc,char *argv[]) {
int i;
if (argc<2) {
fprintf(stderr,"usage: %s name [name...]\n",argv[0]);
exit(EXIT_FAILURE);
}
for (i=1; i<argc; i++) { // foreach arg
struct addrinfo *first_info;
printf("--------%s\n",argv[i]); // which is current arg ?
if (getaddrinfo(argv[i],NULL,NULL,&first_info)) {
printf("unknown\n"); // wrong
} else {
struct addrinfo *info;
for (info=first_info; info!=NULL; info=info->ai_next) { // parses every info
char string[MAXLEN];
struct sockaddr *saddr = info->ai_addr;
if (info->ai_socktype==SOCK_DGRAM) continue; // ignore UDP
switch (saddr->sa_family) {
case AF_INET: // IPv4
{
struct sockaddr_in *sin = (struct sockaddr_in *)saddr;
inet_ntop(saddr->sa_family,&(sin->sin_addr),string,MAXLEN);
}
break;
case AF_INET6: // IPv6
{
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)saddr;
inet_ntop(saddr->sa_family,&(sin6->sin6_addr),string,MAXLEN);
}
break;
default: // What?
strcpy(string,"???");
break;
}
printf("Address: %s\n",string);
}
freeaddrinfo(first_info); // I wanna be free...
}
}
}