#include #include #include #include #include #include #include #include #include int main(int argc, char **argv) { int ret; struct addrinfo *res, *ptr; struct addrinfo hints = { //AI_PASSIVE, AI_CANONNAME, PF_UNSPEC, SOCK_STREAM, 0, 0, NULL, NULL, NULL }; if (argc != 3) { fprintf(stderr, "%s: usage: %s host | addr port.\n", *argv, *argv); exit(1); } ret = getaddrinfo(*argv[1]?argv[1]:NULL,*argv[2]?argv[2]:NULL, &hints, &res); if (ret) { fprintf(stderr, "getaddrinfo1: %s\n", gai_strerror(ret)); exit(1); } for (ptr = res; ptr; ptr = ptr->ai_next) { if (ptr->ai_canonname) printf("Canonical name:\n%s\n", ptr->ai_canonname); printf("Adresse (size %d):\n",ptr->ai_addrlen); switch (ptr->ai_family) { case AF_INET: { char dst[INET_ADDRSTRLEN]; struct sockaddr_in *saddr = (struct sockaddr_in *) ptr->ai_addr; struct in_addr *src = &saddr->sin_addr; if (!inet_ntop(AF_INET, (const void *) src, dst, sizeof(dst))) { fprintf(stderr, "inet_ntop: %s\n", strerror(errno)); break; } fprintf(stdout, "%s:%u\n",dst,ntohl(saddr->sin_port)); break; } case AF_INET6: { char dst[INET6_ADDRSTRLEN]; struct sockaddr_in6 *saddr = (struct sockaddr_in6 *) ptr->ai_addr; struct in6_addr *src = &saddr->sin6_addr; if (!inet_ntop(AF_INET6, (const void *) src, dst, sizeof(dst))) { fprintf(stderr, "inet_ntop: %s\n", strerror(errno)); break; } fprintf(stdout, "%s:%u\n",dst,ntohl(saddr->sin6_port)); break; } case AF_LOCAL: { char *src = &((struct sockaddr_un *) ptr->ai_addr)->sun_path[0]; fprintf(stdout, "%s\n",src); break; } default: fprintf(stderr,"getaddrinfo: %s: %d\n",strerror(EAFNOSUPPORT), ptr->ai_family); } } freeaddrinfo(res); printf("--- gethostby*"); struct hostent *he; char **c; int i; if (!(he = gethostbyname(argv[1]))) { fprintf(stderr,"gethostbyname(%s): %s\n",argv[1],hstrerror(h_errno)); exit(1); } printf("%s",he->h_name); for(c = he->h_aliases;*c;c++) printf(" (%s)",*c); printf("\ntype %d\n",he->h_addrtype); printf("length %d\n",he->h_length); for(c = he->h_addr_list; *c; c++) { for (i=0;ih_length;i++) printf("%x ",(*c)[i]); printf("\n"); } struct servent *se; if (!(se = getservbyname(argv[2],NULL))) { fprintf(stderr,"getservbyname(%s): %s\n",argv[2],hstrerror(h_errno)); exit(1); } printf("%s",se->s_name); for(c = se->s_aliases;*c;c++) printf(" (%s)",*c); printf("\nport %d, proto %s\n",htons(se->s_port),se->s_proto); exit(0); }