Литмир - Электронная Библиотека
Содержание  
A
A

17.3. Операции с сокетами

Существует три типа вызова, или запроса (в зависимости от значения аргумента

request
) функции
ioctl
, предназначенные специально для сокетов [128, с. 551–553]. Все они требуют, чтобы третий аргумент функции
ioctl
был указателем на целое число.

■ 

SIOCATMARK
. Возвращает указатель на ненулевое значение в качестве третьего аргумента (его тип, как только что было сказано, — указатель на целое число), если указатель чтения сокета в настоящий момент находится на отметке внеполосных данных (out-of-band mark), или указатель на нулевое значение, если указатель чтения сокета не находится на этой отметке. Более подробно внеполосные данные (out-of-band data) рассматриваются в главе 24. POSIX заменяет этот вызов функцией
sockatmark
, и мы рассматриваем реализацию этой новой функции с использованием функции
ioctl
в разделе 24.3.

■ 

SIOCGRP
. Возвращает в качестве третьего аргумента указатель на целое число — идентификатор процесса или группы процессов, которым будут посылаться сигналы
SIGIO
или
SIGURG
по окончании выполнения асинхронной операции или при появлении срочных данных. Этот вызов идентичен вызову
F_GETOWN
функции
fcntl
, и в табл. 7.9 мы отмечали, что POSIX стандартизирует функцию
fcntl
.

■ 

SIOCSPGRP
. Задает идентификатор процесса или группы процессов для отсылки им сигналов
SIGIO
или
SIGURG
как целое число, на которое указывает третий аргумент. Этот вызов идентичен вызову
F_SETOWN
функции
fcntl
, и в табл. 7.9 мы отмечали, что POSIX стандартизирует функцию
fcntl
.

17.4. Операции с файлами

Следующая группа вызовов начинается с

FIO
и может применяться к определенным типам файлов в дополнение к сокетам. Мы рассматриваем только вызовы, применимые к сокетам [128, с. 553].

Следующие пять вызовов требуют, чтобы третий аргумент функции

ioctl
указывал на целое число.

■ 

FIONBIO
. Флаг отключения блокировки при выполнении операций ввода-вывода сбрасывается или устанавливается в зависимости от третьего аргумента функции
ioctl
. Если этот аргумент является пустым указателем, то флаг сбрасывается (блокировка разрешена). Если же третий аргумент является указателем на единицу, то включается неблокируемый ввод-вывод. Этот вызов обладает тем же действием, что и команда
F_SETFL
функции
fcntl
, которая позволяет установить или сбросить флаг
O_NONBLOCK
, задающий статус файла.

■ 

FIOASYNC
. Флаг, управляющий получением сигналов асинхронного ввода-вывода (
SIGIO
), устанавливается или сбрасывается для сокета в зависимости от того, является ли третий аргумент функции
ioctl
пустым указателем. Этот флаг имеет то же действие, что и флаг статуса файла
O_ASYNC
, который можно установить и сбросить с помощью команды
F_SETFL
функции
ioctl
.

■ 

FIONREAD
. Возвращает число байтов, в настоящий момент находящихся в приемном буфере сокета, как целое число, на которое указывает третий аргумент функции
ioctl
. Это свойство работает также для файлов, каналов и терминалов. Более подробно об этом вызове мы рассказывали в разделе 14.7.

FIOSETOWN
. Эквивалент
SIOCSPGRP
для сокета.

FIOGETOWN
. Эквивалент
SIOCGPGRP
для сокета.

17.5. Конфигурация интерфейса

Один из шагов, выполняемых многими программами, работающими с сетевыми интерфейсами системы, — это получение от ядра списка всех интерфейсов, сконфигурированных в системе. Это делается с помощью вызова

SIOCGIFCONF
, использующего структуру
ifconf
, которая, в свою очередь, использует структуру
ifreq
. Обе эти структуры показаны в листинге 17.1[1].

Листинг 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 16

struct 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       /* с использованием интерфейсом */

вернуться

1

Все исходные коды программ, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com.

191
{"b":"225366","o":1}