6 #include <sys/socket.h>
7 #include <netinet/in.h>
14 main(int argc, char *argv[])
16 struct addrinfo hints;
17 struct addrinfo *result, *rp;
21 fprintf(stderr, "Usage: %s host port msg...\n", argv[0]);
25 /* Obtain address(es) matching host/port */
27 memset(&hints, 0, sizeof(struct addrinfo));
28 hints.ai_family = 0; /* Allow IPv4 or IPv6 */
29 hints.ai_socktype = SOCK_STREAM; /* Datagram socket */
30 /* hints.ai_flags = 0; */
31 hints.ai_flags = AI_CANONNAME; /* For wildcard IP address */
32 hints.ai_protocol = 0; /* Any protocol */
33 hints.ai_canonname = NULL;
37 s = getaddrinfo(argv[1], argv[2], &hints, &result);
39 fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
43 /* getaddrinfo() returns a list of address structures.
44 Try each address until we successfully connect(2).
45 If socket(2) (or connect(2)) fails, we (close the socket
46 and) try the next address. */
48 for (rp = result; rp != NULL; rp = rp->ai_next) {
49 printf("ai_flags: %d\n", rp->ai_flags);
50 printf("ai_family: %d\n", rp->ai_family);
51 printf("ai_socktype: %d\n", rp->ai_socktype);
52 printf("ai_protocol: %d\n", rp->ai_protocol);
53 printf("ai_addrlen: %d\n", rp->ai_addrlen);
54 printf("ai_addr.type: %d\n", rp->ai_addr->sa_family); /* PF_INET */
55 if (rp->ai_addr->sa_family == AF_INET) {
56 printf("sin_port: %d\n" , ntohs(((struct sockaddr_in *)rp->ai_addr)->sin_port));
57 printf("sin_addr: %s\n", inet_ntoa(((struct sockaddr_in *)rp->ai_addr)->sin_addr));
59 printf("ai_canonname:[%s]\n", rp->ai_canonname);
62 freeaddrinfo(result); /* No longer needed */