UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Листинг 29.6. Функция test_udp: отправка запросов и считывание ответов
//udpcksum/udpcksum.c
12 void
13 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 else
34 printf("UDP checksums onn");
35 if (verbose)
36 printf("received UDP checksum = %xn", ntohs(ui->ui_sum));
37 }
15
nsent
timeout
siglongjmp
sigsetjump
volatile
15-16
SIGALRM
sigsetjmp
siglongjmp
sigsetjmp
siglongjmp
19-23
siglongjmp
Причина, по которой в этом примере мы используем функции
sigsetjmp
siglongjmp
EINTR
udp_read
EINTR
SIGALRM
goto
25-26
send_dns_query
dns_read
alarm
read
SIGALRM
siglongjmp
27-32
В листинге 29.7 показана наша функция
sig_alrm
SIGALRM
Листинг 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-10
canjump
sigsetjmp
siglongjmp
sigsetjmp
В листинге 29.8 показана функция
send_dns_query