Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

Листинг Д.5. Допускаем как использование IP-адреса в точечно-десятичной записи, так и задание имени узла, номера порта или имени службы

//names/daytimetcpcli2.c

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, *addrs[2];

9 struct hostent *hp;

10 struct servent *sp;

11 if (argc != 3)

12 err_quit("usage: daytimetcpcli2 <hostname> <service>");

13 bzero(&servaddr, sizeof(servaddr));

14 servaddr.sin_family = AF_INET;

15 if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) == 1) {

16 addrs[0] = &servaddr.sin_addr;

17 addrs[1] = NULL;

18 pptr = &addrs[0];

19 } else if ((hp = gethostbyname(argv[1])) != NULL) {

20 pptr = (struct in_addr**)hp->h_addr_list;

21 } else

22 err_quit("hostname error for %s: %s", argv[1], hstrerror(h_errno));

23 if ((n = atoi(argv[2])) > 0)

24 servaddr.sin_port = htons(n);

25 else if ((sp = getservbyname(argv[2], "tcp")) != NULL)

26 servaddr.sin_port = sp->s_port;

27 else

28 err_quit("getservbyname error for %s", argv[2]);

29 for (; *pptr != NULL; pptr++) {

30 sockfd = Socket(AF_INET, SOCK_STREAM, 0);

31 memmove(&servaddr.sin_addr, *pptr, sizeof(struct in_addr));

32 printf("trying %s\n",

33 Sock_ntop((SA*)&servaddr, sizeof(servaddr)));

34 if (connect(sockfd, (SA*)&servaddr, sizeof(servaddr)) == 0)

35 break; /* успех */

36 err_ret("connect error");

37 close(sockfd);

38 }

39 if (*pptr == NULL)

40 err_quit("unable to connect");

41 while ((n = Read(sockfd, recvline, MAXLINE)) > 0) {

42 recvline[n] = 0; /* завершающий нуль */

43 Fputs(recvline, stdout);

44 }

45 exit(0);

46 }

11.5. Программа приведена в листинге Д.6.

Листинг Д.6. Модификация листинга 11.2 для работы с IPv4 и IPv6

//names/daytimetcpcli3.c

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 sockaddr_in6 servaddr6;

9 struct sockaddr *sa;

10 socklen_t sal en;

11 struct in_addr **pptr;

12 struct hostent *hp;

13 struct servent *sp;

14 if (argc != 3)

  • Читать дальше
  • 1
  • ...
  • 489
  • 490
  • 491
  • 492
  • 493
  • 494
  • 495
  • 496
  • 497
  • 498
  • 499
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: