UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Многие реализации имеют объявления, аналогичные приведенному ниже, которое взято из заголовочного файла 4.4BSD
<sys/types.h>/* Значение FD_SETSIZE может быть определено пользователем, но заданное здесь по умолчанию является достаточным в большинстве случаев.*/#ifndef FD_SETSIZE#define FD_SETSIZE 256#endifИсходя из этого комментария, можно подумать, что если перед подключением этого заголовочного файла присвоить
FD_SETSIZEselectЧтобы понять, в чем дело, обратите внимание, что на рис. 16.53 [128] объявляются три набора дескрипторов внутри ядра, а в качестве верхнего предела используется определенное в ядре значение FD_SETSIZE. Единственный способ увеличить размер наборов дескрипторов — это увеличить значение FD_SETSIZE и затем перекомпилировать ядро. Изменения значения без перекомпиляции ядра недостаточно.
Некоторые производители изменяют свои реализации функции
selectFD_SETSIZEFD_<i>xxx</i>6.4. Функция str_cli (продолжение)
Теперь мы можем переписать нашу функцию
str_cliselectfgetsselectselect
Рис. 6.7. Условия, обрабатываемые функцией select в вызове функции str_cli
Сокет обрабатывает три условия:
1. Если протокол TCP собеседника отправляет данные, сокет становится готовым для чтения, и функция
read2. Если протокол TCP собеседника отправляет сегмент FIN (процесс завершается), сокет становится готовым для чтения, и функция
read3. Если TCP собеседника отправляет RST (узел вышел из строя и перезагрузился), сокет становится готовым для чтения, и функция
readerrnoВ листинге 6.1 [1] представлен исходный код этой версии функции.
Листинг 6.1. Реализация функции str_cli с использованием функции select (усовершенствованный вариант находится в листинге 6.2)
//select/strcliselect01.c 1 #include "unp.h" 2 void 3 str_cli(FILE *fp, int sockfd) 4 { 5 int maxfdp1; 6 fd_set rset; 7 char sendline[MAXLINE], recvline[MAXLINE]; 8 FD_ZERO(&rset); 9 for (;;) {10 FD_SET(fileno(fp), &rset);11 FD_SET(sockfd, &rset);12 maxfdp1 = max(fileno(fp), sockfd) + 1;13 Select(maxfdp1, &rset, NULL, NULL, NULL);14 if (FD_ISSET(sockfd, &rset)) { /* сокет готов для чтения */15 if (Readline(sockfd, recvline, MAXLINE) == 0)16 err_quit("str_cli: server terminated prematurely");17 Fputs(recvline, stdout);18 }19 if (FD_ISSET(fileno(fp), &rset)) { /* входное устройство готово для чтения */20 if (Fgets(sendline, MAXLINE, fp) == NULL)21 return; /* все сделано */22 Writen(sockfd, sendline, strlen(sendline));23 }24 }25 }8-13FD_ZEROFD_SETfpsockfdfilenoselectpollФункция
select
