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

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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать
Функция siglongjmp

19-23 Этот фрагмент кода выполняется, только когда функция siglongjmpвызывается из нашего обработчика сигнала. Вызов указывает на возникновение условий, при которых мы входим в состояние ожидания: мы отправили запрос, на который не пришло никакого ответа. Если после того, как мы отправим три запроса, ответа не будет, мы прекращаем выполнение кода. По истечении времени ожидания, отведенного на получение ответа, мы выводим соответствующее сообщение и увеличиваем значение времени ожидания в два раза, то есть задаем экспоненциальное смещение ( exponential backoff ), которое также описано в разделе 20.5. Первое значение времени ожидания равно 3 с, затем — 6 с и 12 с.

Причина, по которой в этом примере мы используем функции sigsetjmpи siglongjmp, вместо того чтобы просто перехватывать ошибку EINTR(как мы поступили в листинге 14.1), заключается в том, что библиотечные функции захвата пакетов (которые вызываются из нашей функции udp_read) заново запускают операцию чтения в случае возвращения ошибки EINTR. Поскольку мы не хотим модифицировать библиотечные функции, единственным решением для нас является перехватывание сигнала SIGALRMи выполнение нелокального перехода (оператора goto), который возвращает управление в наш код, а не в библиотечную функцию.

Отправка запроса DNS и считывание ответа

25-26 Функция send_dns_query(см. листинг 29.8) отправляет запрос DNS на сервер имен. Функция dns_readсчитывает ответ. Мы вызываем функцию alarmдля предотвращения «вечной» блокировки функции read. Если истекает заданное (в секундах) время ожидания, генерируется сигнал SIGALRM, и наш обработчик сигнала вызывает функцию siglongjmp.

Анализ полученной контрольной суммы UDP

27-32 Если значение полученной контрольной суммы UDP равно нулю, это значит, что сервер не вычислил и не отправил контрольную сумму.

В листинге 29.7 показана наша функция sig_alrm— обработчик сигнала SIGALRM.

Листинг 29.7. Функция sig_alrm: обработка сигнала SIGALRM

//udpcksum/udpcksum.c

1 #include "udpcksum.h"

2 #include

3 static sigjmp_buf jmpbuf;

4 static int canjump;

5 void

6 sig_alrm(int signo)

7 {

8 if (canjump == 0)

9 return;

10 siglongjmp(jmpbuf, 1);

11 }

8-10 Флаг canjumpбыл установлен в листинге 29.6 после инициализации буфера перехода функцией sigsetjmp. Если флаг был установлен, в результате вызова функции siglongjmpуправление осуществляется таким образом, как если бы функция sigsetjmpиз листинга 29.6 возвратила бы значение 1.

В листинге 29.8 показана функция send_dns_query, посылающая запрос UDP на сервер DNS. Эта функция формирует запрос DNS.

Листинг 29.8. Функция send_dns_query: отправка запроса UDP на сервер DNS

//udpcksum/senddnsquery-raw.c

6 void

7 send_dns_query(void)

8 {

9 size_t nbytes;

10 char *buf, *ptr;

11 buf = Malloc(sizeof(struct udpiphdr) + 100);

12 ptr = buf + sizeof(struct udpiphdr); /* место для заголовков IP и UDP */

13 *((uint16_t*)ptr) = htons(1234); /* идентификатор */

14 ptr += 2;

15 *((uint16_t*)ptr) = htons(0x0100); /* флаги */

16 ptr += 2;

17 *((uint16_t*)ptr) = htons(1); /* количество запросов */

18 ptr += 2;

19 *((uint16_t*)ptr) = 0; /* количество записей в ответе */

20 ptr += 2;

21 *((uint16_t*)ptr) = 0; /* количество авторитетных записей */

22 ptr += 2;

23 *((uint16_t*)ptr) = 0; /* количество дополнительных записей */

24 ptr += 2;

25 memcpy(ptr, "\001a\014root-servers\003net\000", 20);

26 ptr += 20;

27 *((uint16_t*)ptr) = htons(1); /* тип запроса = А */

28 ptr += 2;

29 *((uint16_t*)ptr) = htons(1); /* класс запроса = 1 (IP-адрес) */

30 ptr += 2;

31 nbytes = (ptr - buf) - sizeof(struct udpiphdr);

32 udp_write(buf, mbytes),

33 if (verbose)

35 printf("sent: %d bytes of data\n", nbytes);

36 }

Инициализация указателя на буфер

11-12 В буфере bufимеется место для 20-байтового заголовка IP, 8-байтового заголовка UDP и еще 100 байт для пользовательских данных. Указатель ptrустановлен на первый байт пользовательских данных.

Формирование запроса DNS

13-24 Для понимания деталей устройства дейтаграммы UDP требуется понимание формата сообщения DNS. Эту информацию можно найти в разделе 14.3 [111]. Мы присваиваем полю идентификации значение 1234, сбрасываем флаги, задаем количество запросов — 1, а затем обнуляем количество записей ресурсов (RR, resource records), получаемых в ответ, количество RR, определяющих полномочия, и количество дополнительных RR.

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

Интервал:

Закладка:

Сделать

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

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


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

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

x