UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
1. Полная буферизация (fully buffered) означает, что ввод-вывод имеет место, только когда буфер заполнен, процесс явно вызывает функцию
fflushexit2. Буферизация по строкам (line buffered) означает, что ввод-вывод имеет место, только когда встречается символ перевода строки, процесс вызывает функцию
fflushexit3. Отсутствие буферизации (unbuffered) означает, что ввод-вывод имеет место каждый раз, когда вызывается функция стандартного ввода-вывода.
Большинство реализаций Unix стандартной библиотеки ввода-вывода используют следующие правила:
■ Стандартный поток ошибок никогда не буферизуется.
■ Стандартные потоки ввода и вывода буферизованы полностью, если они не подключены к терминальному устройству, в противном случае они буферизуются по строкам.
■ Все остальные потоки тоже буферизованы полностью, если они не подключены к терминалу, в случае чего они буферизованы по строкам.
Поскольку сокет не является терминальным устройством, проблема, отмеченная с нашей функцией
str_echofpotsetvbuffflushfputsstr_echoБудьте осторожны — некоторые реализации стандартной библиотеки ввода-вывода все еще вызывают проблемы при работе с дескрипторами, большими 255. Эта проблема может возникнуть с сетевыми серверами, обрабатывающими множество дескрипторов. Проверьте определение структуры FILE в вашем заголовочном файле <stdio.h>, чтобы увидеть, к какому типу переменных относится дескриптор.
14.9. Расширенный опрос
В начале этой главы мы рассказывали о способах установки таймеров для операций с сокетами. Во многих операционных системах для этого существуют функции
pollselectИнтерфейс /dev/poll
В Solaris имеется специальный файл
/dev/pollselectpollПосле открытия
/dev/pollpollfdpollreventswrite/dev/pollioctl DP_POLLioctlstruct dvpoll { struct pollfd* dp_fds; int dp_nfds; int dp_timeout;};Поле
dp_fdspollfdioctldp_nfdsioctldp_timeoutioctlИзмененный код функции
str_cli/dev/pollЛистинг 14.7. Функция str_cli, использующая /dev/poll
//advio/str_cli_poll03.c 1 #include "unp.h" 2 #include <sys/devpoll.h> 3 void 4 str_cli(FILE *fp, int sockfd) 5 { 6 int stdineof; 7 char buf[MAXLINE]; 8 int n; 9 int wfd;10 struct pollfd pollfd[2];11 struct dvpoll dopoll;12 int i;13 int result;14 wfd = Open("/dev/poll", O_RDWR, 0);15 pollfd[0].fd = fileno(fp);16 pollfd[0].events = POLLIN;17 pollfd[0].revents = 0;18 pollfd[1].fd = sockfd;19 pollfd[1].events = POLLIN;20 pollfd[1].revents = 0;21 Write(wfd, pollfd, sizeof(struct pollfd) * 2);
