#include #include #include #include #include #include static int usage() { printf("usage: ./getaddrinfo [inet|inet6|all] port [host]\n"); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { char *host, *type, *port; struct addrinfo hints, *res = 0; int ret; if (argc != 3 && argc != 4) usage(); type = argv[1]; port = argv[2]; if (argc == 4) host = argv[3]; else host = NULL; memset (&hints, 0, sizeof (hints)); if (!strcmp("inet", type)) hints.ai_family = AF_INET; else if (!strcmp("inet6", type)) hints.ai_family = AF_INET6; else if (!strcmp("all", type)) hints.ai_family = AF_UNSPEC; else usage(); hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_ADDRCONFIG | AI_PASSIVE; ret = getaddrinfo(host, port, &hints, &res); if (ret) { printf("getaddrinfo: %s", strerror(-ret)); return EXIT_FAILURE; } { char host[64]; char serv[64]; ret = getnameinfo(res->ai_addr, res->ai_addrlen, host, sizeof(host), serv, sizeof(serv), NI_NUMERICHOST | NI_NUMERICSERV); printf("%s %s (%d)\n", host, serv, ret); ret = getnameinfo(res->ai_addr, res->ai_addrlen, host, sizeof(host), serv, sizeof(serv), 0); printf("%s %s (%d)\n", host, serv, ret); puts("ok"); } freeaddrinfo(res); return 0; }