#include #include #include #include #include #include #include #include /* int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); void freeaddrinfo(struct addrinfo *res); struct addrinfo { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; size_t ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct addrinfo *ai_next; }; */ static char * ptostring(int prot) { switch (prot) { case IPPROTO_IP: return "IPPROTO_IP"; case IPPROTO_TCP: return "IPPROTO_TCP"; case IPPROTO_UDP: return "IPPROTO_UDP"; default: return "unknown"; } } int main(int ac, char *av[]) { char * host = av[1]; struct addrinfo *info, *pinfo; struct addrinfo hint; memset(&hint, 0, sizeof hint); hint.ai_flags = AI_CANONNAME; int rc = getaddrinfo(host, NULL, &hint, &info); if (rc != 0) gai_strerror(rc), exit(-1); for (pinfo = info; pinfo; pinfo = pinfo->ai_next) { switch (pinfo->ai_family) { case AF_INET: { struct sockaddr_in *sa; sa = (struct sockaddr_in *)pinfo->ai_addr; printf("AF_INET: %s canon=%s prot=%s\n", inet_ntoa(sa->sin_addr), pinfo->ai_canonname, ptostring(pinfo->ai_protocol)); break; } default: printf("Unknown address family\n"); break; } } freeaddrinfo(info); return 0; }