UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Листинг 29.6. Функция test_udp: отправка запросов и считывание ответов
//udpcksum/udpcksum.c12 void13 test_udp(void)14 {15 volatile int nsent = 0, timeout = 3;16 struct udpiphdr *ui;17 Signal(SIGALRM, sig_alrm);18 if (sigsetjmp(jmpbuf, 1)) {19 if (nsent >= 3)20 err_quit("no response");21 printf("timeoutn");22 timeout *= 2; /* геометрическая прогрессия: 3, 6, 12 */23 }24 canjump = 1; /* siglongjmp разрешен */25 send_dns_query();26 nsent++;27 alarm(timeout);28 ui = udp_read();29 canjump = 0;30 alarm(0);31 if (ui->ui_sum == 0)32 printf("UDP checksums offn");33 else34 printf("UDP checksums onn");35 if (verbose)36 printf("received UDP checksum = %xn", ntohs(ui->ui_sum));37 }15nsenttimeoutsiglongjmpsigsetjumpvolatile15-16SIGALRMsigsetjmpsiglongjmpsigsetjmpsiglongjmp19-23siglongjmpПричина, по которой в этом примере мы используем функции
sigsetjmpsiglongjmpEINTRudp_readEINTRSIGALRMgoto25-26send_dns_querydns_readalarmreadSIGALRMsiglongjmp27-32В листинге 29.7 показана наша функция
sig_alrmSIGALRMЛистинг 29.7. Функция sig_alrm: обработка сигнала SIGALRM
//udpcksum/udpcksum.c 1 #include "udpcksum.h" 2 #include <setjmp.h> 3 static sigjmp_buf jmpbuf; 4 static int canjump; 5 void 6 sig_alrm(int signo) 7 { 8 if (canjump == 0) 9 return;10 siglongjmp(jmpbuf, 1);11 }8-10canjumpsigsetjmpsiglongjmpsigsetjmpВ листинге 29.8 показана функция
send_dns_query
