UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
20-24rtt_init25-41msghdrВторая часть функции вместе с обработчиком сигнала
sig_alarmЛистинг 22.7. Функция dg_send_recv: вторая половина
//rtt/dg_send_rеcv.c42 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 void66 sig_alrm(int signo)67 {68 siglongjmp(jmpbuf, 1);69 }42-43SIGALRMrtt_newpack45-47rtt_tshdrsendmsgrtt_startSIGALRMalarm48recvmsgsigsetjmpsiglongjmpSIGALRMsigsetjmp49-55rtt_timeouterrnoETIMEDOUT57-59recvmsghdrrecvmsg60-62alarmrtt_stoprtt_ts65-69siglongjmpsigsetjmpdg_send_recvТеперь мы рассмотрим различные функции RTT, которые вызывались нашей функцией
dg_send_recvunprtt.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 {
