UNIX: разработка сетевых приложений
Часть 191 из 399 Информация о книге
17.3. Операции с сокетами
Существует три типа вызова, или запроса (в зависимости от значения аргумента
) функцииrequest, предназначенные специально для сокетов [128, с. 551–553]. Все они требуют, чтобы третий аргумент функцииioctlбыл указателем на целое число.ioctl■
. Возвращает указатель на ненулевое значение в качестве третьего аргумента (его тип, как только что было сказано, — указатель на целое число), если указатель чтения сокета в настоящий момент находится на отметке внеполосных данных (out-of-band mark), или указатель на нулевое значение, если указатель чтения сокета не находится на этой отметке. Более подробно внеполосные данные (out-of-band data) рассматриваются в главе 24. POSIX заменяет этот вызов функциейSIOCATMARK, и мы рассматриваем реализацию этой новой функции с использованием функцииsockatmarkв разделе 24.3.ioctl■
. Возвращает в качестве третьего аргумента указатель на целое число — идентификатор процесса или группы процессов, которым будут посылаться сигналыSIOCGRPилиSIGIOпо окончании выполнения асинхронной операции или при появлении срочных данных. Этот вызов идентичен вызовуSIGURGфункцииF_GETOWN, и в табл. 7.9 мы отмечали, что POSIX стандартизирует функциюfcntl.fcntl■
. Задает идентификатор процесса или группы процессов для отсылки им сигналовSIOCSPGRPилиSIGIOкак целое число, на которое указывает третий аргумент. Этот вызов идентичен вызовуSIGURGфункцииF_SETOWN, и в табл. 7.9 мы отмечали, что POSIX стандартизирует функциюfcntl.fcntl17.4. Операции с файлами
Следующая группа вызовов начинается с
и может применяться к определенным типам файлов в дополнение к сокетам. Мы рассматриваем только вызовы, применимые к сокетам [128, с. 553].FIOСледующие пять вызовов требуют, чтобы третий аргумент функции
указывал на целое число.ioctl■
. Флаг отключения блокировки при выполнении операций ввода-вывода сбрасывается или устанавливается в зависимости от третьего аргумента функцииFIONBIO. Если этот аргумент является пустым указателем, то флаг сбрасывается (блокировка разрешена). Если же третий аргумент является указателем на единицу, то включается неблокируемый ввод-вывод. Этот вызов обладает тем же действием, что и командаioctlфункцииF_SETFL, которая позволяет установить или сбросить флагfcntl, задающий статус файла.O_NONBLOCK■
. Флаг, управляющий получением сигналов асинхронного ввода-вывода (FIOASYNC), устанавливается или сбрасывается для сокета в зависимости от того, является ли третий аргумент функцииSIGIOпустым указателем. Этот флаг имеет то же действие, что и флаг статуса файлаioctl, который можно установить и сбросить с помощью командыO_ASYNCфункцииF_SETFL.ioctl■
. Возвращает число байтов, в настоящий момент находящихся в приемном буфере сокета, как целое число, на которое указывает третий аргумент функцииFIONREAD. Это свойство работает также для файлов, каналов и терминалов. Более подробно об этом вызове мы рассказывали в разделе 14.7.ioctl■
. ЭквивалентFIOSETOWNдля сокета.SIOCSPGRP■
. ЭквивалентFIOGETOWNдля сокета.SIOCGPGRP17.5. Конфигурация интерфейса
Один из шагов, выполняемых многими программами, работающими с сетевыми интерфейсами системы, — это получение от ядра списка всех интерфейсов, сконфигурированных в системе. Это делается с помощью вызова
, использующего структуруSIOCGIFCONF, которая, в свою очередь, использует структуруifconf. Обе эти структуры показаны в листинге 17.1 [1].ifreqЛистинг 17.1. Структуры ifconf и ifreq, используемые в различных вызовах функции ioctl, относящихся к интерфейсам
//<net/if.h> struct ifconf {int ifc_len; /* размер буфера, "значение-результат" */union {caddr_t ifcu_buf; /* ввод от пользователя к ядру */struct ifreq *ifcu_req; /* ядро возвращает пользователю */} ifc_ifcu;};#define ifc_buf ifc_ifcu.ifcu_buf /* адрес буфера */#define ifc_req ifc_ifcu.ifcu_req /* массив возвращенных структур */#define IFNAMSIZ 16struct ifreq {char ifr_name[IFNAMSIZ]; /* имя интерфейса, например "le0" */union {struct sockaddr ifru_addr;struct sockaddr ifru_dstaddr;struct sockaddr ifru_broadaddr;short ifru_flags;int ifru_metric;caddr_t ifru_data;} ifr_ifru;};#define ifr_addr ifr_ifru.ifru_addr /* адрес */#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* другой конец линии передачи, называемой"точка-точка" */#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* широковещательный адрес */#define ifr_flags ifr_ifru.ifru_flags /* флаги */#define ifr_metric ifr_ifru.ifru_metric /* метрика */#define ifr_data ifr_ifru.ifru_data /* с использованием интерфейсом */