Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

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

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

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

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

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

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

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

1

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

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

Прежде чем вызвать функцию

ioctl
, мы выделяем в памяти место для буфера и для структуры
ifconf
, а затем инициализируем эту структуру. Мы показываем это на рис. 17.1, предполагая, что наш буфер имеет размер 1024 байта. Третий аргумент функции
ioctl
— это указатель на нашу структуру
ifconf
.

Рис. 17.1. Инициализация структуры ifconf перед вызовом SIOCGIFCONF

Если мы предположим, что ядро возвращает две структуры

ifreq
, то при завершении функции
ioctl
мы можем получить ситуацию, представленную на рис. 17.2. Затененные области были изменены функцией
ioctl
. Буфер заполняется двумя структурами, и элемент
ifc_len
структуры
ifconf
обновляется, с тем чтобы соответствовать количеству информации, хранимой в буфере. Предполагается, что на этом рисунке каждая структура
ifreq
занимает 32 байта.

  • Читать дальше
  • 1
  • ...
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: