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

Тут можно читать онлайн Уильям Стивенс - UNIX: разработка сетевых приложений - бесплатно ознакомительный отрывок. Жанр: comp-osnet, издательство Питер, год 2007. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    UNIX: разработка сетевых приложений
  • Автор:
  • Жанр:
  • Издательство:
    Питер
  • Год:
    2007
  • Город:
    Санкт-Петербург
  • ISBN:
    5-94723-991-4
  • Рейтинг:
    4.33/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

UNIX: разработка сетевых приложений - описание и краткое содержание, автор Уильям Стивенс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

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

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

UNIX: разработка сетевых приложений - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Уильям Стивенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

32 iovsend[1].iov_base = outbuff;

33 iovsend[1].iov_len = outbytes;

34 msgrecv.msg_name = NULL;

35 msgrecv.msg_namelen = 0;

36 msgrecv.msg_iov = iovrecv;

37 msgrecv.msg_iovlen = 2;

38 iovrecv[0].iov_base = &recvhdr;

39 iovrecv[0].iov_len = sizeof(struct hdr);

40 iovrecv[l].iov_base = inbuff;

41 iovrecv[l].iov_len = inbytes;

1-5 Мы включаем новый заголовочный файл unprtt.h, показанный в листинге 22.8, который определяет структуру rtt_info, содержащую информацию RTT для клиента. Мы определяем одну из этих структур и ряд других переменных.

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

6-10 Мы хотим скрыть от вызывающего процесса добавление порядкового номера и отметки времени в начало каждого пакета. Проще всего использовать для этого функцию writev, записав свой заголовок (структура hdr), за которым следуют данные вызывающего процесса, в виде одной дейтаграммы UDP. Вспомните, что результатом выполнения функции writevна дейтаграммном сокете является отправка одной дейтаграммы. Это проще, чем заставлять вызывающий процесс выделять для нас место в начале буфера, а также быстрее, чем копировать наш заголовок и данные вызывающего процесса в один буфер (под который мы должны выделить память) для каждой функции sendto. Но поскольку мы работаем с UDP и нам необходимо задать адрес получателя, следует использовать возможности, предоставляемые структурой iovecфункций sendmsgи recvmsgи отсутствующие в функциях sendtoи recvfrom. Вспомните из раздела 14.5, что в некоторых системах доступна более новая структура msghdr, включающая вспомогательные данные ( msg_control), тогда как в более старых системах вместо них применяются элементы msg_accright(так называемые права доступа — access rights), расположенные в конце структуры. Чтобы избежать усложнения кода директивами #ifdefдля обработки этих различий, мы объявляем две структуры msghdrкак static. При этом они инициализируются только нулевыми битами, а затем неиспользованные элементы в конце структур просто игнорируются.

Инициализация при первом вызове

20-24 При первом вызове нашей функции мы вызываем функцию rtt_init.

Заполнение структур msghdr

25-41 Мы заполняем две структуры msghdr, используемые для ввода и вывода. Для данного пакета мы увеличиваем на единицу порядковый номер отправки, но не устанавливаем отметку времени отправки, пока пакет не будет отправлен (поскольку он может отправляться повторно, а для каждой повторной передачи требуется текущая отметка времени).

Вторая часть функции вместе с обработчиком сигнала sig_alarmпоказана в листинге 22.7.

Листинг 22.7. Функция dg_send_recv: вторая половина

//rtt/dg_send_rеcv.c

42 Signal(SIGALRM, sig_alrm);

43 rtt_newpack(&rttinfo); /* инициализируем для этого пакета */

44 sendagain:

45 sendhdr.ts = rtt_ts(&rttinfo);

46 Sendmsg(fd, &msgsend, 0);

47 alarm(rtt_start(&rttinfo)); /* вычисляем тайм-аут. запускаем таймер */

48 if (sigsetjmp(jmpbuf, 1) != 0) {

49 if (rtt_timeout(&rttinfо) < 0) {

50 err_msg("dg_send_recv: no response from server, giving up");

51 rttinit = 0; /* повторная инициализация для следующего вызова */

52 errno = ETIMEDOUT;

53 return (-1);

54 }

55 goto sendagain;

56 }

57 do {

58 n = Recvmsg(fd, &msgrecv, 0);

59 } while (n < sizeof(struct hdr) || recvhdr.seq != sendhdr.seq);

60 alarm(0); /* останавливаем таймер SIGALRM */

61 /* вычисляем и записываем новое значение оценки RTT */

62 rtt_stop(&rttinfo, rtt_ts(&rttinfo) — recvhdr.ts);

63 return (n - sizeof(struct hdr)); /* возвращаем размер полученной

дейтаграммы */

64 }

65 static void

66 sig_alrm(int signo)

67 {

68 siglongjmp(jmpbuf, 1);

69 }

Установка обработчика сигналов

42-43 Для сигнала SIGALRMустанавливается обработчик сигналов, а функция rtt_newpackустанавливает счетчик повторных передач в нуль.

Отправка дейтаграммы

45-47 Функция rtt_tsполучает текущую отметку времени. Отметка времени хранится в структуре hdr, которая добавляется к данным пользователя. Одиночная дейтаграмма UDP отправляется функцией sendmsg. Функция rtt_startвозвращает количество секунд для этого тайм-аута, а сигнал SIGALRMконтролируется функцией alarm.

Установка буфера перехода

48 Мы устанавливаем буфер перехода для нашего обработчика сигналов с помощью функции sigsetjmp. Мы ждем прихода следующей дейтаграммы, вызывая функцию recvmsg. (Совместное использование функций sigsetjmpи siglongjmpвместе с сигналом SIGALRMмы обсуждали применительно к листингу 20.5.) Если время таймера истекает, функция sigsetjmpвозвращает 1.

Обработка тайм-аута

49-55 Когда возникает тайм-аут, функция rtt_timeoutвычисляет следующее значение RTO (используя экспоненциальное смещение) и возвращает -1, если нужно прекратить попытки передачи дейтаграммы, или 0, если нужно выполнить очередную повторную передачу. Когда мы прекращаем попытки, мы присваиваем переменной errnoзначение ETIMEDOUTи возвращаемся в вызывающую функцию.

Вызов функции 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, в секундах */

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

Интервал:

Закладка:

Сделать


Уильям Стивенс читать все книги автора по порядку

Уильям Стивенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге UNIX: разработка сетевых приложений, автор: Уильям Стивенс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x