daytimetcpcli1.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include "unp.h"
  2. int
  3. main(int argc, char **argv)
  4. {
  5. int sockfd, n;
  6. char recvline[MAXLINE + 1];
  7. struct sockaddr_in servaddr;
  8. struct in_addr **pptr;
  9. struct in_addr *inetaddrp[2];
  10. struct in_addr inetaddr;
  11. struct hostent *hp;
  12. struct servent *sp;
  13. if (argc != 3)
  14. err_quit("usage: daytimetcpcli1 <hostname> <service>");
  15. if ( (hp = gethostbyname(argv[1])) == NULL) {
  16. if (inet_aton(argv[1], &inetaddr) == 0) {
  17. err_quit("hostname error for %s: %s", argv[1], hstrerror(h_errno));
  18. } else {
  19. inetaddrp[0] = &inetaddr;
  20. inetaddrp[1] = NULL;
  21. pptr = inetaddrp;
  22. }
  23. } else {
  24. pptr = (struct in_addr **) hp->h_addr_list;
  25. }
  26. if ( (sp = getservbyname(argv[2], "tcp")) == NULL)
  27. err_quit("getservbyname error for %s", argv[2]);
  28. for ( ; *pptr != NULL; pptr++) {
  29. sockfd = Socket(AF_INET, SOCK_STREAM, 0);
  30. bzero(&servaddr, sizeof(servaddr));
  31. servaddr.sin_family = AF_INET;
  32. servaddr.sin_port = sp->s_port;
  33. memcpy(&servaddr.sin_addr, *pptr, sizeof(struct in_addr));
  34. printf("trying %s\n",
  35. Sock_ntop((SA *) &servaddr, sizeof(servaddr)));
  36. if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) == 0)
  37. break; /* success */
  38. err_ret("connect error");
  39. close(sockfd);
  40. }
  41. if (*pptr == NULL)
  42. err_quit("unable to connect");
  43. while ( (n = Read(sockfd, recvline, MAXLINE)) > 0) {
  44. recvline[n] = 0; /* null terminate */
  45. Fputs(recvline, stdout);
  46. }
  47. exit(0);
  48. }