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

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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать
Вызов функции recvmsg, сравнение порядковых номеров

57-59 Мы ждем прихода дейтаграммы, вызывая функцию recvmsg. Длина полученной дейтаграммы не должна быть меньше размера структуры hdr, а ее порядковый номер должен совпадать с порядковым номером запроса, ответом на который предположительно является эта дейтаграмма. Если при сравнении хотя бы одно из этих условий не выполняется, функция recvmsgвызывается снова.

Выключение таймера и обновление показателей RTT

60-62 Когда приходит ожидаемый ответ, функция alarmотключается, а функция rtt_stopобновляет оценочное значение RTT. Функция rtt_tsвозвращает текущую отметку времени, и отметка времени из полученной дейтаграммы вычитается из текущей отметки, что дает в результате RTT.

Обработчик сигнала SIGALRM

65-69Вызывается функция siglongjmp, результатом выполнения которой является то, что функция sigsetjmpв dg_send_recvвозвращает 1.

Теперь мы рассмотрим различные функции RTT, которые вызывались нашей функцией dg_send_recv. В листинге 22.8 показан заголовочный файл unprtt.h.

Листинг 22.8. Заголовочный файл unprtt.h

//lib/unprtt.h

1 #ifndef __unp_rtt_h

2 #define __unp_rtt_h

3 #include "unp.h"

4 struct rtt_info {

5 float rtt_rtt; /* последнее измеренное значение RTT в секундах */

6 float rtt_srtt; /* сглаженная оценка RTT в секундах */

7 float rtt_rttvar; /* сглаженные средние значения отклонений

в секундах */

8 float rtt_rto; /* текущее используемое значение RTO, в секундах */

9 int rtt_nrexmt; /* количество повторных передач: 0, 1, 2, ... */

10 uint32_t rtt_base; /* число секунд, прошедшее после 1.1.1970 в начале */

11 };

12 #define RTT_RXTMIN 2 /* минимальное значение тайм-аута для

повторной передачи, в секундах */

13 #define RTT_RXTMAX 60 /* максимальное значение тайм-аута для

повторной передачи, в секундах */

14 #define RTT_MAXNREXMT 3 /* максимально допустимое количество

повторных передач одной дейтаграммы */

15 /* прототипы функций */

16 void rtt_debug(struct rtt_info*);

17 void rtt_init(struct rtt_info*);

18 void rtt_newpack(struct rtt_info*);

19 int rtt_start(struct rtt_info*);

20 void rtt_stop(struct rtt_info*, uint32_t);

21 int rtt_timeout(struct rtt_info*);

22 uint32_t rtt_ts(struct rtt_info*);

23 extern int rtt_d_flag; /* может быть ненулевым при наличии

дополнительной информации */

24 #endif /* _unp_rtt_h */

Структура rtt_info

4-11 Эта структура содержит переменные, необходимые для того, чтобы определить время передачи пакетов между клиентом и сервером. Первые четыре переменных взяты из уравнений, приведенных в начале этого раздела.

12-14 Эти константы определяют минимальный и максимальный тайм-ауты повторной передачи и максимальное число возможных повторных передач.

В листинге 22.9 показан макрос RTT_RTOCALCи первые две из четырех функций RTT.

Листинг 22.9. Макрос RTT_RTOCALC, функции rtt_minmax и rtt_init

//lib/rtt.c

1 #include "unprtt.h"

2 int rtt_d_flag = 0; /* отладочный флаг; может быть установлен в

ненулевое значение вызывающим процессом */

3 /* Вычисление значения RTO на основе текущих значений:

4 * сглаженное оценочное значение RTT + четырежды сглаженная

5 * величина отклонения.

6 */

7 #define RTI_RTOCALC(ptr) ((ptr)->rtt_srtt + (4.0 * (ptr)->rtt_rttvar))

8 static float

9 rtt_minmax(float rto)

10 {

11 if (rto < RTT_RXTMIN)

12 rto = RTT_RXTMIN;

13 else if (rto > RTT_RXTMAX)

14 rto = RTT_RXTMAX;

15 return (rto);

16 }

17 void

18 rtt_init(struct rtt_info *ptr)

19 {

20 struct timeval tv;

21 Gettimeofday(&tv, NULL);

22 ptr->rtt_base = tv.tv_sec; /* количество секунд, прошедших с 1.1.1970 */

23 ptr->rtt_rtt = 0;

24 ptr->rtt_srtt = 0;

25 ptr->rtt_rttvar = 0.75;

26 ptr->rtt_rto = rtt_minmax(RTT_RTOCALC(ptr));

27 /* первое RTO (srtt + (4 * rttvar)) = 3 с */

28 }

3-7 Макрос вычисляет RTO как сумму оценочной величины RTT и оценочной величины среднего отклонения, умноженной на четыре.

8-16 Функция rtt_minmaxпроверяет, что RTO находится между верхним и нижним пределами, заданными в заголовочном файле unprtt.h.

17-28 Функция rtt_initвызывается функцией dg_send_recvпри первой отправке пакета. Функция gettimeofdayвозвращает текущее время и дату в той же структуре timeval, которую мы видели в функции select(см. раздел 6.3). Мы сохраняем только текущее количество секунд с момента начала эпохи Unix, то есть с 00:00:00 1 января 1970 года (UTC). Измеряемое значение RTT обнуляется, а сглаженная оценка RTT и среднее отклонение принимают соответственно значение 0 и 0,75, в результате чего начальное RTO равно 3 с (4×0,75).

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

Интервал:

Закладка:

Сделать

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

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


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

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

x