UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
44 rtt_newpack(struct rtt_info *ptr)45 {46 ptr->rtt_nrexmt = 0;47 }48 int49 rtt_start(struct rtt_info *ptr)50 {51 return ((int)(ptr->rtt_rto + 0.5)); /* округляем float до int */52 /* возвращенное значение может быть использовано как аргумент alarm(rtt_start(&fоо)) */53 }34-42rtt_tsgettimeofdayrtt_initrtt_basertt_infogettimeofdayРазница во времени между двумя вызовами функции
rtt_tstimeval43-47rtt_newpack48-53rtt_startalarmФункция
rtt_stopЛистинг 22.11. Функция rtt_stop: обновление показателей RTT и вычисление нового
//lib/rtt.c62 void63 rtt_stop(struct rtt_info *ptr, uint32_t ms)64 {65 double delta;66 ptr->rtt_rtt = ms / 1000.0; /* измеренное значение RTT в секундах */67 /*68 * Обновляем оценочные значения RTT среднего отклонения RTT.69 * (См. статью Джекобсона (Jacobson). SIGCOMM'88. Приложение А.)70 * Здесь мы для простоты используем числа с плавающей точкой.71 */72 delta = ptr->rtt_rtt - ptr->rtt_srtt;73 ptr->rtt_srtt += delta / 8; /* g - 1/8 */74 if (delta < 0.0)75 delta = -delta; /* |delta| */76 ptr->rtt_rttvar += (delta - ptr->rtt_rttvar) / 4; /* h - 1/4 */77 ptr->rtt_rto = rtt_minmax(RTT_RTOCALC(ptr));78 }62-78rtt_tsrtt_srttrtt_rttvarrtt_rtoПоследняя функция,
rtt_timeoutЛистинг 22.12. Функция rtt_timeout: применение экспоненциального смещения
//lib/rtt.c83 int84 rtt_timeout(struct rtt_info *ptr)85 {86 ptr->rtt_rto *= 2; /* следующее значение RTO */87 if (++ptr->rtt_nrexmt > RTT_MAXNREXMT)88 return (-1); /* закончилось время, отпущенное на попытки отправить этот пакет */89 return (0);90 }8687-89В нашем примере клиент соединялся дважды с двумя различными эхо-серверами в Интернете утром рабочего дня. Каждому серверу было отправлено по 500 строк. По пути к первому серверу было потеряно 8 пакетов, по пути ко второму — 16. Один из потерянных шестнадцати пакетов, предназначенных второму серверу, был потерян дважды, то есть пакет пришлось дважды передавать повторно, прежде чем был получен ответ. Все остальные потерянные пакеты пришлось передать повторно только один раз. Мы могли убедиться, что эти пакеты были действительно потеряны, посмотрев на выведенные порядковые номера каждого из полученных пакетов. Если пакет лишь опоздал, но не был потерян, после повторной передачи клиент получает два ответа: соответствующий запоздавшему первому пакету и повторно переданному. Обратите внимание, что у нас нет возможности определить, что именно было потеряно (и привело к необходимости повторной передачи клиентского запроса) — сам клиентский запрос или же ответ сервера, высланный после получения такого запроса.
Для первого издания этой книги автор написал для проверки этого клиента сервер UDP, который случайным образом игнорировал пакеты. Теперь он не используется. Нужно только соединить клиент с сервером через Интернет, и тогда нам почти гарантирована потеря некоторых пакетов!
22.6. Связывание с адресами интерфейсов
Одно из типичных применений функции
get_ifi_infoIP_RECVDSTADDR
