UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
2. Что произойдет в листинге 16.6, если процесс сервера завершится преждевременно и дочерний процесс получит признак конца файла, но не уведомит об этом родительский процесс?
3. Что произойдет в листинге 16.6, если родительский процесс непредвиденно завершится до завершения дочернего процесса, и дочерний процесс затем считает конец файла на сокете?
4. Что произойдет в листинге 16.7, если мы удалим следующие две строки:
if (n == 0) goto done; /* функция connect завершилась немедленно */5. В разделе 16.3 мы сказали, что возможна ситуация, когда данные для сокета придут раньше, чем завершится функция
connectГлава 17
Операции функции ioctl
17.1. Введение
Функция
ioctlioctlioctltcgetattrtcflushioctlsockatmarkSIOCATMARK ioctlioctlВ этой главе представлен обзор команд функции
ioctlAF_ROUTEОбычно сетевые программы (как правило, серверы) используют функцию
ioctlioctl17.2. Функция ioctl
Эта функция работает с открытым файлом, дескриптор которого передается через аргумент
fd#include <unistd.h>int ioctl(int <i>fd</i>, int <i>request</i>, ... /* void *<i>arg</i> */ );<i>Возвращает: 0 в случае успешного выполнения, -1 в случае ошибки</i>Третий аргумент всегда является указателем, но тип указателя зависит от аргумента
requestВ 4.4BSD второй аргумент имеет тип unsigned long вместо int, но это не вызывает проблем, поскольку в заголовочных файлах определены константы, используемые для данного аргумента. Пока прототип функции подключен к программе, система будет обеспечивать правильную типизацию.
Некоторые реализации определяют третий аргумент как неопределенный указатель (void*), а не так, как он определен в ANSI С.
Не существует единого стандарта заголовочного файла, определяющего прототип функции для ioctl, поскольку он не стандартизован в POSIX. Многие системы определяют этот прототип в файле <unistd.h>, как это показываем мы, но традиционные системы BSD определяют его в заголовочном файле <sys/ioctl.h>.
Мы можем разделить аргументы
request■ операции с сокетами;
■ операции с файлами;
■ операции с интерфейсами;
■ операции с кэшем ARP;
■ операции с таблицей маршрутизации;
■ операции с потоками (см. главу 31).
Помимо того, что, как показывает табл. 7.9, некоторые операции
ioctlfcntlioctlВ табл. 17.1 перечислены аргументы request вместе с типами данных, на которые должен указывать адрес
argТаблица 17.1. Обзор сетевых вызовов ioctl
| Категория | request | Описание | Тип данных |
|---|---|---|---|
| Сокет | SIOCATMARK | Находится ли указатель чтения сокета на отметке внеполосных данных | int |
| SIOCSPGRP | Установка идентификатора процесса или идентификатора группы процессов для сокета | int | |
| SIOCGPGRP | Получение идентификатора процесса или идентификатора группы процессов для сокета | int | |
| Файл | FIONBIO | Установка/сброс флага отсутствия блокировки | int |
| FIOASYNC | Установка/сброс флага асинхронного ввода-вывода | int | |
| FIONREAD | Получение количества байтов в приемном буфере | int | |
| FIOSETOWN | Установка идентификатора процесса или идентификатора группы процессов для файла | int | |
| FIOGETOWN | Получение идентификатора процесса или идентификатора группы процессов для файла | int | |
| Интерфейс | SIOCGIFCONF | Получение списка всех интерфейсов | struct ifconf |
| SIOCSIFADDR | Установка адреса интерфейса | struct ifreq | |
| SIOCGIFADDR | Получение адреса интерфейса | struct ifreq | |
| SIOCSIFFLAGS | Установка флагов интерфейса | struct ifreq | |
| SIOCGIFFLAGS | Получение флагов интерфейса | struct ifreq | |
| SIOCSIFDSTADDR | Установка адреса типа «точка-точка» | struct ifreq | |
| SIOCGIFDSTADDR | Получение адреса типа «точка-точка» | struct ifreq | |
| SIOCGIFBRDADDR | Получение широковещательного адреса | struct ifreq | |
| SIOCSIFBRDADDR | Установка широковещательного адреса | struct ifreq | |
| SIOCGIFNETMASK | Получение маски подсети | struct ifreq | |
| SIOCSIFNETMASK | Установка маски подсети | struct ifreq | |
| SIOCGIFMETRIC | Получение метрики интерфейса | struct ifreq | |
| SIOCSIFMETRIC | Установка метрики интерфейса | struct ifreq | |
| SIOCxxx | (Множество вариантов в зависимости от реализации) | ||
| ARP | SIOCSARP | Создание/модификация элемента ARP | struct arpreq |
| SIOCGARP | Получение элемента ARP | struct arpreq | |
| SIOCDARP | Удаление элемента ARP | struct arpreq | |
| Маршрутизация | SIOCADDRT | Добавление маршрута | struct rtentry |
| SIOCDELRT | Удаление маршрута | struct rtentry | |
| Потоки | I_xxx | (См. раздел 31.5) |
