Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 42 стр.

UptoLike

Составители: 

42
выполнена успешно и –1, если произошла ошибка. В случае ошибки переменная errno
может принимать следующие значения:
EBADF аргумент SOCKET не является правильным дескриптором
файла;
ENOTSOCK дескриптор SOCKET не является гнездом;
ENOBUFS размера внутренних буферов недостаточно для выполнения
операции.
Имена интерфейсов
Каждый сетевой интерфейс имеет собственное имя. Обычно оно состоит из
нескольких букв, определяющих тип интерфейса и цифры, определяющей его номер,
если таких интерфейсов несколько. К таким именам интерфейсов относятся, например,
lo (интерфейс обратной связи), eth0 (первый интерфейс Ethernet). Однако использование
символьных имен интерфейсов в программах довольно неудобно, поэтому интерфейсы
определяются выбранных случайно целым положительным числом.
Следующие функции, константы и типы данных определяются в заголовочном
файле <net/if.h>.
const size_t IFNAMSIZ
Эта константа определяет максимальный размер буфера, необходимого для
хранения имени интерфейса, включающего завершающий нулевой символ.
unsigned int if_nametoindex (const char *ifname)
Эта функция выдает индекс интерфейса, соответствующий символьному
имени.
char * if_indextoname (unsigned int ifindex, char *ifname)
Эта функции соотносит индекс интерфейса с его символьным именем.
Возвращаемое имя помещается в буфер, на который указывает аргумент ifname,
который должен быть длиной по крайней мере IFNAMSIZE байтов. Если задаваемый
индекс интерфейса неправилен, функция возвращает нулевое значение.
struct if_nameindex {
unsigned int if_index;
char *if_name;
};
Этот тип данных используется для хранения данных об интерфейсе. Здесь
if_index – индекс интерфейса, if_name – символьное имя интерфейса, заканчивающееся
нулевым символом.
struct if_nameindex * if_nameindex (void)
Эта функция возвращает массив структур if_nameindex. Каждый элемент
массива соответствует одному присутствующему в системе интерфейсу. Конец массива
указывается элементом, в котором номер интерфейса равен нулю, а указатель на
символьное имя является нулевым указателем. Если произошла ошибка, функция
возвращает нулевой указатель.
void if_freenameindex (struct if_nameindex *ptr)
Эта функция освобождает память, занимаемую структурой, создаваемой
вызовом if_nameindex.
Локальное пространство имен
Локальное пространство имен в некоторым источникам может называться
такжедоменными гнездами”.
В локальном пространстве имен адреса гнезд представляются именами файлов.
Возможно назначить любое имя файла адресом гнезда, однако необходимо иметь права
на запись в том директории, где создается такой файл. В случае подключения в гнезду,
выполнена успешно и –1, если произошла ошибка. В случае ошибки переменная errno
может принимать следующие значения:
EBADF                аргумент SOCKET не является правильным дескриптором
                     файла;
ENOTSOCK             дескриптор SOCKET не является гнездом;
ENOBUFS              размера внутренних буферов недостаточно для выполнения
                     операции.

        Имена интерфейсов
        Каждый сетевой интерфейс имеет собственное имя. Обычно оно состоит из
нескольких букв, определяющих тип интерфейса и цифры, определяющей его номер,
если таких интерфейсов несколько. К таким именам интерфейсов относятся, например,
lo (интерфейс обратной связи), eth0 (первый интерфейс Ethernet). Однако использование
символьных имен интерфейсов в программах довольно неудобно, поэтому интерфейсы
определяются выбранных случайно целым положительным числом.
        Следующие функции, константы и типы данных определяются в заголовочном
файле .
         const size_t IFNAMSIZ
       Эта константа определяет максимальный размер буфера, необходимого для
хранения имени интерфейса, включающего завершающий нулевой символ.
         unsigned int if_nametoindex (const char *ifname)
         Эта функция выдает индекс интерфейса, соответствующий символьному
имени.
         char * if_indextoname (unsigned int ifindex, char *ifname)
        Эта функции соотносит индекс интерфейса с его символьным именем.
Возвращаемое имя помещается в буфер, на который указывает аргумент ifname,
который должен быть длиной по крайней мере IFNAMSIZE байтов. Если задаваемый
индекс интерфейса неправилен, функция возвращает нулевое значение.
         struct if_nameindex {
              unsigned int if_index;
              char *if_name;
         };
         Этот тип данных используется для хранения данных об интерфейсе. Здесь
if_index – индекс интерфейса, if_name – символьное имя интерфейса, заканчивающееся
нулевым символом.
         struct if_nameindex * if_nameindex (void)
       Эта функция возвращает массив структур if_nameindex. Каждый элемент
массива соответствует одному присутствующему в системе интерфейсу. Конец массива
указывается элементом, в котором номер интерфейса равен нулю, а указатель на
символьное имя является нулевым указателем. Если произошла ошибка, функция
возвращает нулевой указатель.
         void if_freenameindex (struct if_nameindex *ptr)
       Эта функция освобождает память, занимаемую структурой, создаваемой
вызовом if_nameindex.

        Локальное пространство имен
        Локальное пространство имен в некоторым источникам может называться
также “доменными гнездами”.
        В локальном пространстве имен адреса гнезд представляются именами файлов.
Возможно назначить любое имя файла адресом гнезда, однако необходимо иметь права
на запись в том директории, где создается такой файл. В случае подключения в гнезду,


         42