UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Тайм-аут для функции recvfrom (сигнал SIGALRM)
В листинге 14.2 показана новая версия функции
dg_clialarmЛистинг 14.2. Функция dg_cli, в которой при установке тайм-аута для функции recvfrom используется функция alarm
//advio/dgclitimeo3.c 1 #include "unp.h" 2 static void signalrm(int); 3 void 4 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) 5 { 6 int n; 7 char sendline[MAXLINE], recvline[MAXLINE + 1]; 8 Signal(SIGALRM, signalrm); 9 while (Fgets(sendline, MAXLINE, fp) != NULL) {10 Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);11 alarm(5);12 if ((n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL)) < 0) {13 if (errno == EINTR)14 fprintf(stderr, "socket timeoutn");15 else16 err_sys("recvfrom error");17 } else {18 alarm(0);19 recvline[n] = 0; /* завершающий нуль */20 Fputs(recvline, stdout);21 }22 }23 }24 static void25 sig_alrm(int signo)26 {27 return; /* просто прерываем recvfrom() */28 }8-22SIGALRMalarmrecvfromrecvfrom24-28recvfromЭтот пример работает корректно, потому что каждый раз, когда мы устанавливаем функцию
alarmalarmТайм-аут для функции recvfrom (функция select)
Мы демонстрируем вторую технологию для установки тайм-аута (использование функции
selectreadable_timeoЛистинг 14.3. Функция readable_timeo: ожидание, когда дескриптор станет готов для чтения
//lib/readable_timео.c 1 #include "unp.h" 2 int 3 readable_timeo(int fd, int sec) 4 { 5 fd_set rset; 6 struct timeval tv; 7 FD_ZERO(&rset); 8 FD_SET(fd, &rset); 9 tv.tv_sec = sec;10 tv.tv_usec = 0;11 return (select(fd + 1, &rset, NULL, NULL, &tv));12 /* > если дескриптор готов для чтения */13 }7-10timeval11-12selectselectЭта функция не выполняет операции чтения — она просто ждет, когда дескриптор будет готов к чтению. Следовательно, эту функцию можно использовать с любым типом сокета — TCP или UDP.
Создание аналогичной функции, называемой
writable_timeoМы используем эту функцию в листинге 14.4, где показана еще одна версия нашей функции
dg_clirecvfromreadable_timeoМы не вызываем функцию
recvfromreadable_timeorecvfromЛистинг 14.4. Функция dg_cli, вызывающая функцию readable_timeo для установки тайм-аута
//advio/dgclitimeo1.c
