UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Первые шесть операций могут применяться к сокетам любым процессом, следующие две (операции над интерфейсами) используются реже, а последние две (ARP и таблица маршрутизации) выполняются администрирующими программами, такими как
ifconfigrouteioctlСуществует множество способов выполнения первых четырех операций, но, как указано в последней колонке, стандарт POSIX определяет, что функция
fcntlsockatmarkОтметим также, что первые две операции, устанавливающие сокет для неблокируемого ввода-вывода и для ввода-вывода, управляемого сигналом, традиционно применялись с использованием команд FNDELAY и FASYNC функции fcntl. POSIX определяет константы О_xxx.
Функция
fcntl■ Неблокируемый ввод-вывод. Мы можем установить флаг состояния файла
O_NONBLOCKF_SETFL■ Управляемый сигналом ввод-вывод. Мы можем установить флаг состояния файла
O_ASYNCF_SETFL■ Команда
F_SETOWNSIGIOSIGURGF_GETOWNТермин «владелец сокета» определяется POSIX. Исторически реализации, происходящие от Беркли, называли его «идентификатор группы процессов сокета», потому что переменная, хранящая этот идентификатор, — это элемент so_pgid структуры socket [128, с. 438].
#include <fcntl.h>int fcntl(int <i>fd</i>, int <i>cmd</i>, ... /* int arg */);<i>Возвращает: в случае успешного выполнения результат зависит от аргумента cmd, -1 в случае ошибки</i>Каждый дескриптор (включая сокет) имеет набор флагов, которые можно получить с помощью команды
F_GETFLF_SETFL■
O_NONBLOCK■
O_ASYNCПозже мы опишем оба эти флага подробнее. Отметим, что типичный код, который устанавливает неблокируемый ввод-вывод с использованием функции
fcntlint flags;/* Делаем сокет неблокируемым */if ((flags = fcntl(fd, F_GETFL, 0)) < 0) err_sys("F_GETFL error");flags |= O_NONBLOCK;if (fcntl(fd, F_SETFL, flags) < 0) err_sys("F_SETFL error");Учтите, что вам может встретиться код, который просто устанавливает желаемый флаг:
/* Неправильный способ сделать сокет неблокируемым */if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) err_sys("F_SETFL error");Хотя при этом и устанавливается флаг отключения блокировки, также снимаются все остальные флаги состояния файла. Единственный корректный способ установить один из этих флагов состояния файла — получить текущие флаги, с помощью операции логического ИЛИ добавить новый флаг, а затем установить флаги.
Следующий код сбрасывает флаг отключения блокировки в предположении, что переменная
flagsfcntlflags &= ~O_NONBLOCK;if (fcntl(fd, F_SETFL, flags) < 0) err_sys("F_SETFL error");Сигналы
SIGIOSIGURGF_SETOWNargF_SETOWNF_GETOWNfcntlКогда создается новый сокет с помощью функции socket, у него нет владельца. Сокет, создаваемый из прослушиваемого сокета, наследует от него принадлежность владельцу (как и многие другие параметры сокетов [128, с. 462-463].
7.12. Резюме
Параметры сокетов лежат в широком диапазоне от очень общих (
SO_ERRORSO_KEEPALIVESO_RCVBUFSO_SNDBUFSO_REUSEADDRbindSO_BROADCAST
