UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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 */4-1112-14В листинге 22.9 показан макрос
RTT_RTOCALCЛистинг 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 void18 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-78-16rtt_minmaxunprtt.h17-28rtt_initdg_send_recvgettimeofdaytimevalselectВ листинге 22.10 показаны следующие три функции RTT.
Листинг 22.10. Функции rtt_ts, rtt_newpack и rtt_start
//lib/rtt.c34 uint32_t35 rtt_ts(struct rtt_info *ptr)36 {37 uint32_t ts;38 struct timeval tv;39 Gettimeofday(&tv, NULL);40 ts = ((tv.tv_sec - ptr->rtt_base) * 1000) + (tv.tv_usec / 1000);41 return (ts);42 }43 void
