Уильям Стивенс - UNIX - разработка сетевых приложений

Здесь есть возможность читать онлайн «Уильям Стивенс - UNIX - разработка сетевых приложений» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Санкт-Петербург, Год выпуска: 2007, ISBN: 2007, Издательство: Питер, Жанр: ОС и Сети, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

UNIX: разработка сетевых приложений: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «UNIX: разработка сетевых приложений»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.

UNIX: разработка сетевых приложений — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «UNIX: разработка сетевых приложений», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

56 pr->sarecv = Calloc(1, ai->ai_addrlen);

57 pr->salast = Calloc(1, ai->ai_addrlen);

58 pr->sabind = Calloc(1, ai->ai_addrlen);

59 pr->salen = ai->ai_addrlen;

60 traceloop();

61 exit(0);

62 }

Определение структуры proto

2-9 Определяются две структуры proto, одна для IPv4 и другая для IPv6, хотя указатели на структуры адреса сокета не размещаются в памяти до окончания выполнения данной функции.

Установка значений по умолчанию

10-13 Максимальное значение поля TTL или поля предельного количества транзитных узлов, используемое в программе, по умолчанию равно 30. Предусмотрен параметр командной строки -m, чтобы пользователь мог поменять это значение. Для каждого значения TTL посылается три пробных пакета, но их количество также может быть изменено с помощью параметра командной строки. Изначально используется номер порта получателя 32 768 + 666, и каждый раз, когда посылается новая дейтаграмма UDP, это значение увеличивается на 1. Мы можем надеяться, что порты с такими номерами не используются на узле получателя в тот момент, когда приходит дейтаграмма, однако гарантии здесь нет.

Обработка аргументов командной строки

19-37 Параметр командной строки -v позволяет вывести все остальные ICMP-сообщения.

Обработка имени узла или IP-адреса и завершение инициализации

38-58 Имя узла получателя или IP-адрес обрабатывается функцией host_serv, возвращающей указатель на структуру addrinfo. В зависимости от типа возвращенного адреса (IPv4 или IPv6) заканчивается инициализация структуры proto, сохраняется указатель в глобальной переменной pr, а также размещается в памяти дополнительная структура адреса сокета соответствующего размера.

Функция traceloop, приведенная в листинге 28.15, отправляет дейтаграммы и читает вернувшиеся ICMP-сообщения. Это основной цикл программы.

Листинг 28.15. Функция traceloop: основной цикл обработки

//traceroute/traceloop.c

1 #include "trace.h"

2 void

3 traceloop(void)

4 {

5 int seq, code, done;

6 double rtt;

7 struct rec *rec;

8 struct timeval tvrecv;

9 recvfd = Socket(pr->sasend->sa_family, SOCK_RAW, pr->icmpproto);

10 setuid(getuid()); /* права привилегированного пользователя больше

не нужны */

11 #ifdef IPV6

12 if (pr->sasend->sa_family == AF_INET6 && verbose == 0) {

13 struct icmp6_filter myfilt;

14 ICMP6_FILTER_SETBLOCKALL(&myfilt);

15 ICMP6_FILTER_SETPASS(ICMP6_TIME_EXCEEDED, &myfilt);

16 ICMP6_FILTER_SETPASS(ICMP6_DST_UNREACH, &myfilt);

17 setsockopt(recvfd, IPPROTO_IPV6, ICMP6_FILTER,

18 &myfilt, sizeof(myfilt));

19 }

20 #endif

21 sendfd = Socket(pr->sasend->sa_family, SOCK_DGRAM, 0);

22 pr->sabind->sa_family = pr->sasend->sa_family;

23 sport = (getpid() & 0xffff) | 0x8000; /* UDP-порт отправителя # */

24 sock_set_port(pr->sabind, pr->salen, htons(sport));

25 Bind(sendfd, pr->sabind, pr->salen);

26 sig_alrm(SIGALRM);

27 seq = 0;

28 done = 0;

29 for (ttl = 1; ttl ttllevel, pr->ttloptname, &ttl, sizeof(int));

31 bzero(pr->salast, pr->salen);

32 printf("%2d ", ttl);

33 fflush(stdout);

34 for (probe = 0; probe

35 rec = (struct rec*)sendbuf;

36 rec->rec_seq = ++seq;

37 rec->rec_ttl = ttl;

38 Gettimeofday(&rec->rec_tv, NULL);

39 sock_set_port(pr->sasend, pr->salen, htons(dport + seq));

40 Sendto(sendfd, sendbuf, datalen, 0, pr->sasend, pr->salen);

41 if ((code = (*pr->recv)(seq, &tvrecv)) == -3)

42 printf(" *"); /* тайм-аут, ответа нет */

43 else {

44 char str[NI_MAXHOST];

45 if (sock_cmp_addr(pr->sarecv, pr->salast, pr->salen) != 0) {

46 if (getnameinfo(pr->sarecv, pr->salen, str, sizeof(str),

47 NULL, 0, 0) == 0)

48 printf(" %s (%s)", str,

49 Sock_ntop_host(pr->sarecv, pr->salen));

50 else

51 printf(" %s", Sock_ntop_host(pr->sarecv, pr->salen));

52 memcpy(pr->salast, pr->sarecv, pr->salen);

53 }

54 tv_sub(&tvrecv, &rec->rec_tv);

55 rtt = tvrecv.tv_sec * 1000.0 + tvrecv.tv_usec / 1000.0;

56 printf(" %.3f ms", rtt);

57 if (code == -1) /* порт получателя недоступен */

58 done++;

59 else if (code >= 0)

60 printf(" (ICMP %s)", (*pr->icmpcode)(code));

61 }

62 fflush(stdout);

63 }

64 printf("\n");

65 }

66 }

Создание двух сокетов

9-10 Нам необходимо два сокета: символьный сокет, на котором мы читаем все вернувшиеся ICMP-сообщения, и UDP-сокет, на который мы посылаем пробные пакеты с увеличивающимся значением поля TTL. После создания символьного сокета мы заменяем наш эффективный идентификатор пользователя на фактический, поскольку более нам не понадобятся права привилегированного пользователя.

Установка фильтра ICMPv6

11-20 Если мы отслеживаем маршрут к адресату IPv6 и параметр командной строки -V указан не был, можно установить фильтр, который будет блокировать все ICMP-сообщения, за исключением тех, которые нас интересуют: «Time exceeded» и «Destination unreachable». Это сократит число пакетов, получаемых на данном сокете.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «UNIX: разработка сетевых приложений»

Представляем Вашему вниманию похожие книги на «UNIX: разработка сетевых приложений» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «UNIX: разработка сетевых приложений»

Обсуждение, отзывы о книге «UNIX: разработка сетевых приложений» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x