Уильям Стивенс - UNIX - разработка сетевых приложений

Здесь есть возможность читать онлайн «Уильям Стивенс - UNIX - разработка сетевых приложений» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Санкт-Петербург, Год выпуска: 2007, ISBN: 2007, Издательство: Питер, Жанр: ОС и Сети, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

UNIX: разработка сетевых приложений: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «UNIX: разработка сетевых приложений»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.

UNIX: разработка сетевых приложений — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «UNIX: разработка сетевых приложений», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

18.6. Функции имени и индекса интерфейса

Документ RFC 3493 [36] определяет четыре функции, обрабатывающие имена и индексы интерфейсов. Эти четыре функции используются во многих случаях, когда необходимо описать интерфейс. Они были предложены в процессе разработки API IPv6 (главы 21 и 27), однако индексы интерфейсов имеются и в API IPv4 (например, в вызове IP_RECVIFили AF_LINKдля маршрутизирующего сокета). Основной принцип, объявляемый в этом документе, состоит в том, что каждый интерфейс имеет уникальное имя и уникальный положительный индекс (нуль в качестве индекса никогда не используется).

#include

unsigned int if_nametoindex(const char * ifname );

Возвращает: положительный индекс интерфейса в случае успешного выполнения, 0 в случае ошибки

char *if_indextoname(unsigned int ifindex , char * ifname );

Возвращает: указатель на имя интерфейса в случае успешного выполнения, NULL в случае ошибки

struct if_nameindex *if_nameindex(void);

Возвращает: непустой указатель в случае успешного выполнения, NULL в случае ошибки

void if_freenameindex(struct if_nameindex * Iptr );

Функция if_nametoindexвозвращает индекс интерфейса, имеющего имя ifname. Функция if_indextonameвозвращает указатель на имя интерфейса, если задан его индекс ifindex. Аргумент ifnameуказывает на буфер размера IFNAMSIZ(определяемый в заголовочном файле из листинга 17.1), который вызывающий процесс должен выделить для хранения результата, и этот указатель возвращается в случае успешного выполнения функции if_indextoname.

Функция if_nameindexвозвращает указатель на массив структур if_nameindex:

struct if_nameindex {

unsigned int if_index; /* 1, 2. ... */

char *if_name; /* имя, завершаемое нулем: "le0", ... */

};

Последняя запись в этом массиве содержит структуру с нулевым индексом if_indexи с пустым указателем ifname. Память для этого массива, а также для имен, на которые указывают элементы массива, выделяется динамически и освобождается при вызове функции if_freenameindex.

Теперь мы представим реализацию этих четырех функций с использованием маршрутизирующих сокетов.

Функция if_nametoindex

В листинге 18.11 показана функция if_nametoindex.

Листинг 18.11. Возвращение индекса интерфейса по его имени

//libroute/if_nametoindex.c

1 #include "unpifi.h"

2 #include "unproute.h"

3 unsigned int

4 if_nametoindex(const char *name)

5 {

6 unsigned int idx, namelen;

7 char *buf, *next, *lim;

8 size_t len;

9 struct if_msghdr *ifm;

10 struct sockadd *sa, *rti_info[RTAX_MAX];

11 struct sockaddr_dl *sdl;

12 if ((buf = net_rt_iflist(0, 0, &len)) == NULL)

13 return(0);

14 namelen = strlen(name);

15 lim = buf + len;

16 for (next = buf; next ifm_msglen) {

17 ifm = (struct if_msghdr*)next;

18 if (ifm->ifm_type == RTM_IFINFO) {

19 sa = (struct sockaddr*)(ifm + 1);

20 get_rtaddrs(ifm->ifm_addrs, sa, rti_info);

21 if ((sa = rti_infо[RTAX_IFP]) != NULL) {

22 if (sa->sa_family == AF_LINK) {

23 sdl = (struct sockaddr_dl*)sa;

24 if (sdl->sdl_nlen == namelen

25 && strncmp(&sdl->sdl_data[0], name,

26 sdl->sdl_nlen) == 0) {

27 idx = sdl->sdl_index; /* сохранение перед

вызовом free */

28 free(buf);

29 return(idx);

30 }

31 }

32 }

33 }

34 }

35 free(buf);

36 return(0); /* индекс для имени не найден */

37 }

Получение списка интерфейсов

12-13Наша функция net_rt_iflistвозвращает список интерфейсов.

Обработка только сообщений RTM_IFINFO

17-30Мы обрабатываем сообщения в буфере (см. рис. 18.4) в поисках сообщений типа RTM_IFINFO. Найдя такое сообщение, мы вызываем нашу функцию get_rtaddrs, чтобы установить указатели на структуры адреса сокета, а если присутствует структура имени интерфейса (элемент RTAX_IFPмассива rti_info), то имя интерфейса сравнивается с аргументом.

Функция if_indextoname

Следующая функция, if_indextoname, показана в листинге 18.12.

Листинг 18.12. Возвращение имени интерфейса по его индексу

libroute/if_indextoname.c

1 #include "unpifi.h"

2 #include "unproute.h"

3 char*

4 if_indextoname(unsigned int index, char *name)

5 {

6 char *buf, *next, *lim;

7 size_t len;

8 struct if_msghdr *ifm;

9 struct sockaddr *sa, *rti_info[RTAX_MAX];

10 struct sockaddr_dl *sdl;

11 if ((buf = net_rt_iflist(0, index, &len)) == NULL)

12 return (NULL);

13 lim = buf + len;

14 for (next = buf; next ifm_msglen) {

15 ifm = (struct if_msghdr*)next;

16 if (ifm->ifm_type == RTM_IFINFO) {

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «UNIX: разработка сетевых приложений»

Представляем Вашему вниманию похожие книги на «UNIX: разработка сетевых приложений» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «UNIX: разработка сетевых приложений»

Обсуждение, отзывы о книге «UNIX: разработка сетевых приложений» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x