UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Рассмотрим пример, иллюстрирующий листинг 4.3. Прежде всего, на рис. 4.5 показано состояние клиента и сервера в тот момент, когда сервер блокируется при вызове функции accept и от клиента приходит запрос на соединение.

Рис. 4.5. Состояние соединения клиент-сервер перед завершением вызванной функции accept
Сразу же после завершения функции
acceptconnfd
Рис. 4.6. Состояние соединения клиент-сервер после завершения функции accept
Следующим действием параллельного сервера является вызов функции
forkfork
Рис. 4.7. Состояние соединения клиент-сервер после вызова функции fork
Обратите внимание, что оба дескриптора
listenfdconnfdДалее родительский процесс закрывает присоединенный сокет, а дочерний процесс закрывает прослушиваемый сокет. Это показано на рис. 4.8.

Рис. 4.8. Состояние соединения клиент-сервер после закрытия родительским и дочерним процессами соответствующих сокетов
Это и есть требуемое конечное состояние сокетов. Дочерний процесс управляет соединением с клиентом, а родительский процесс может снова вызвать функцию
accept4.9. Функция close
Обычная функция Unix
close#include <unistd.h>int close(int <i>sockfd</i>);По умолчанию функция
closereadwriteВ разделе 7.5 рассказывается о параметре сокета
SO_LINGERСчетчик ссылок дескриптора
В конце раздела 4.8 мы отметили, что когда родительский процесс на нашем параллельном сервере закрывает присоединенный сокет с помощью функции
closecloseЕсли мы хотим отправить сегмент FIN по соединению TCP, вместо функции
closeshutdownНеобходимо также знать, что происходит с нашим параллельным сервером, если родительский процесс не вызывает функцию
closeacceptclose4.10. Функции getsockname и getpeername
Эти две функции возвращают либо локальный (функция
getsocknamegetpeername#include <sys/socket.h>int getsockname(int <i>sockfd</i>, struct sockaddr *<i>localaddr</i>, socklen_t *<i>addrlen</i>);int getpeername(int <i>sockfd</i>, struct sockaddr *<i>peeraddr</i>, socklen_t *<i>addrlen</i>);Обратите внимание, что последний аргумент обеих функций относится к типу «значение-результат», то есть обе функции будут заполнять структуру адреса сокета, на которую указывает аргумент
localaddrpeeraddrОбсуждая функцию bind, мы отметили, что термин «имя» используется некорректно. Эти две функции возвращают адрес протокола, связанный с одним из концов сетевого соединения, что для протоколов IPv4 и IPv6 является сочетанием IP-адреса и номера порта. Эти функции также не имеют ничего общего с доменными именами (глава 11).
Функции
getsocknamegetpeername■ После успешного выполнения функции
connectbindgetsockname■ После вызова функции
bindgetsockname■ Функцию
getsockname■ Сервер TCP, который с помощью функции
bindacceptgetsocknamesockfd
