18a19 > char *get_ip_str(); 27c28,30 < int rval, sockfd; --- > int rval, sockfd6; > struct addrinfo addrinfo; > struct addrinfo *res, *r; 29,30d31 < struct sockaddr_in dest_sin; < struct servent *srvp; 57,70c58,65 < /* Try as host name */ < if (host_ent = gethostbyname(argv[1])) { < dest_sin.sin_family = host_ent->h_addrtype; < if (host_ent->h_length > sizeof( dest_sin.sin_addr)) { < fprintf(stderr, "%s: address length wrong.\n", argv[0]); < exit(2); < } < memcpy(&dest_sin.sin_addr, host_ent->h_addr_list[0], host_ent->h_length); < /* Try as IP address */ < } else { < if(dest_sin.sin_addr.s_addr = inet_addr(argv[1])) { < fprintf(stderr, "%s: cannot find address for '%s'.\n", argv[0], argv[1]); < exit(2); < } --- > /* Get address info for specified host and demo service */ > memset(&addrinfo, 0, sizeof(addrinfo)); > addrinfo.ai_family=PF_UNSPEC; > addrinfo.ai_socktype=SOCK_STREAM; > addrinfo.ai_protocol=IPPROTO_TCP; > if (rval = getaddrinfo(argv[1], "demo", &addrinfo, &res) != 0) { > fprintf(stderr, "%s: Failed to resolve address information.\n", argv[0]); > exit(2); 73,91c68,70 < /* Get service information */ < if ((srvp = getservbyname("demo", "tcp")) == 0) { < fprintf(stderr, "%s: cannot find port number for demo service.\n", argv[0]); < exit(3); < } else { < dest_sin.sin_port = srvp->s_port; < } < < /* Iterate over address list for host and try to connect */ < success=0; < for(addrlist = host_ent->h_addr_list; *addrlist != NULL; addrlist++) < { < memcpy((caddr_t)&dest_sin.sin_addr, (caddr_t)*addrlist, sizeof(dest_sin.sin_addr)); < if ((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) < { < fprintf(stderr, "%s: Could not create socket.\n", argv[0]); < exit(4); < } < if (connect(sockfd, (struct sockaddr *)&dest_sin, sizeof(dest_sin)) < 0) --- > for (r=res; r; r = r->ai_next) { > sockfd6 = socket(r->ai_family, r->ai_socktype, r->ai_protocol); > if (connect(sockfd6, r->ai_addr, r->ai_addrlen) < 0) 94c73 < (void) close(sockfd); --- > (void) close(sockfd6); 96,97c75,76 < fprintf(stderr, "%s: Failed attempt to %s.\n", argv[0], < inet_ntoa(dest_sin.sin_addr)); --- > fprintf(stderr, "%s: Failed attempt to %s.\n", argv[0], > get_ip_str((struct sockaddr *)r->ai_addr, buf, BUFLEN)); 100,101c79,80 < snprintf(s, BUFLEN, "%s: Succeeded to %s (%d).", argv[0], < inet_ntoa(dest_sin.sin_addr), dest_sin.sin_addr); --- > snprintf(s, BUFLEN, "%s: Succeeded to %s.", argv[0], > get_ip_str((struct sockaddr *)r->ai_addr, buf, BUFLEN)); 109a89 > freeaddrinfo(res); 113c93,95 < inet_ntoa(dest_sin.sin_addr), sockfd); --- > get_ip_str((struct sockaddr *)r->ai_addr, buf, BUFLEN), > sockfd6); > freeaddrinfo(res); 121,123c103,105 < FD_SET(sockfd, &read_fds); < FD_SET(sockfd, &except_fds); < select(fileno(stdin) > sockfd ? fileno(stdin)+1 : sockfd+1, --- > FD_SET(sockfd6, &read_fds); > FD_SET(sockfd6, &except_fds); > select(fileno(stdin) > sockfd6 ? fileno(stdin)+1 : sockfd6+1, 129c111 < close(sockfd); --- > close(sockfd6); 140c122 < if (FD_ISSET(sockfd, &except_fds)) --- > if (FD_ISSET(sockfd6, &except_fds)) 146c128 < if (FD_ISSET(sockfd, &read_fds)) --- > if (FD_ISSET(sockfd6, &read_fds)) 149c131 < mlen = recv(sockfd, (void *)buf, BUFLEN-1, MSG_DONTWAIT); --- > mlen = recv(sockfd6, (void *)buf, BUFLEN-1, MSG_DONTWAIT); 165c147 < send(sockfd, (void *)buf, (size_t) strnlen(buf, BUFLEN), 0)); --- > send(sockfd6, (void *)buf, (size_t) strnlen(buf, BUFLEN), 0)); 191a174,191 > char *get_ip_str(const struct sockaddr *sa, char *s, size_t maxlen) > { > switch(sa->sa_family) { > case AF_INET: > inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr), s, maxlen); > break; > > case AF_INET6: > inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr), s, maxlen); > break; > > default: > strncpy(s, "Unknown AF", maxlen); > return s; > } > return s; > } >