UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Та же проблема связана с вызовом
readlineselectstdioreadlinereadlineselectreadlinereadlineПроблемы буферизации мы постараемся решить в усовершенствованной версии
str_cli6.6. Функция shutdown
Обычный способ завершить сетевое соединение — вызвать функцию
closecloseshutdown1. Функция close последовательно уменьшает счетчик ссылок дескриптора и закрывает сокет, только если счетчик доходит до нуля. Мы рассматривали это в разделе 4.8. Используя функцию
shutdown2. Функция
closestr_cli
Рис. 6.10. Вызов функции shutdown для закрытия половины соединения TCP
#include <sys/socket.h>int shutdown(int <i>sockfd</i>, int <i>howto</i>);<i>Возвращает: 0 в случае успешного выполнения, -1 в случае ошибки</i>Действие функции зависит от значения аргумента
howto■
SHUT_RDshutdownПо умолчанию все, что записывается в маршрутизирующий сокет (см. главу 17), возвращается как возможный ввод на все маршрутизирующие сокеты узла. Некоторые программы вызывают функцию shutdown со вторым аргументом SHUT_RD, чтобы предотвратить получение подобной копии. Другой способ избежать копирования — отключить параметр сокета SO_USELOOPBACK.
■
SHUT_WR■
SHUT_RDWRshutdownSHUT_RDSHUT_WRВ табл. 7.4 приведены все возможные сценарии, доступные процессу при вызове функций
shutdowncloseSO_LINGERТри константы SHUT_xxx определяются в спецификации POSIX. Типичные значения аргумента howto, с которыми вы встретитесь, — это 0 (закрытие читающей половины), 1 (закрытие записывающей половины) и 2 (закрытие обеих половин).
6.7. Функция str_cli (еще раз)
В листинге 6.2 представлена наша обновленная (и корректная) функция
str_cliselectshutdownЛистинг 6.2. функция str_cli, использующая функцию select, которая корректно обрабатывает конец файла
//select/strcliselect02.c 1 #include "unp.h" 2 void 3 str_cli(FILE *fp, int sockfd) 4 { 5 int maxfdp1, stdineof; 6 fd_set rset; 7 char buf[MAXLINE]; 8 int n; 9 stdineof = 0;10 FD_ZERO(&rset);11 for (;;) {12 if (stdineof == 0)13 FD_SET(fileno(fp), &rset);14 FD_SET(sockfd, &rset);15 maxfdp1 = max(fileno(fp), sockfd) + 1;16 Select(maxfdp1, &rset, NULL, NULL, NULL);17 if (FD_ISSET(sockfd, &rset)) { /* сокет готов для чтения */18 if ((n = Read(sockfd, buf, MAXLINE)) == 0) {19 if (stdineof == 1)20 return; /* нормальное завершение */21 else22 err_quit("str_cli: server terminated prematurely");
