1 #include "unp.h"
2
3 int
main(int argc,char ** argv)4 main(int argc, char **argv)
5 {
6 int sockfd, n;
7 char recvline[MAXLINE + 1];
8 struct sockaddr_in servaddr;
9 struct sockaddr_in6 servaddr6;
10 struct sockaddr *sa;
11 socklen_t salen;
12 struct in_addr **pptr;
13 struct hostent *hp;
14 struct servent *sp;
15
16 if (argc != 3)
17 err_quit("usage: daytimetcpcli3 <hostname> <service>");
18
19 if ( (hp = gethostbyname(argv[1])) == NULL)
20 err_quit("hostname error for %s: %s", argv[1], hstrerror(h_errno));
21
22 if ( (sp = getservbyname(argv[2], "tcp")) == NULL)
23 err_quit("getservbyname error for %s", argv[2]);
24
25 pptr = (struct in_addr **) hp->h_addr_list;
26 for ( ; *pptr != NULL; pptr++) {
27 sockfd = Socket(hp->h_addrtype, SOCK_STREAM, 0);
28
29 if (hp->h_addrtype == AF_INET) {
30 sa = (SA *) &servaddr;
31 salen = sizeof(servaddr);
32 } else if (hp->h_addrtype == AF_INET6) {
33 sa = (SA *) &servaddr6;
34 salen = sizeof(servaddr6);
35 } else
36 err_quit("unknown addrtype %d", hp->h_addrtype);
37
38 bzero(sa, salen);
39 sa->sa_family = hp->h_addrtype;
40 sock_set_port(sa, salen, sp->s_port);
41 sock_set_addr(sa, salen, *pptr);
42
43 printf("trying %s\n", Sock_ntop(sa, salen));
44
45 if (connect(sockfd, sa, salen) == 0)
46 break; /* success */
47 err_ret("connect error");
48 close(sockfd);
49 }
50 if (*pptr == NULL)
51 err_quit("unable to connect");
52
53 while ( (n = Read(sockfd, recvline, MAXLINE)) > 0) {
54 recvline[n] = 0; /* null terminate */
55 Fputs(recvline, stdout);
56 }
57 exit(0);
58 }
59