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

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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

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

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

19 if ((sa = rti_info[RTAX_IFP]) != NULL) {

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

21 sdl = (struct sockaddr_dl*)sa;

22 if (sdl->sdl_index == index) {

23 int slen = min(IFNAMSIZ - 1, sdl->sdl_nlen);

24 strncpy(name, sdl->sdl_data, slen);

25 name[slen] = 0; /* завершающий нуль */

26 free(buf);

27 return (name);

28 }

29 }

30 }

31 }

32 }

33 free(buf);

34 return (NULL); /* нет соответствия индексу */

35 }

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

Функция if_nameindex

Следующая функция, if_nameindex, возвращает массив структур if_nameindex, содержащих все имена интерфейсов и индексы. Она показана в листинге 18.13.

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

/ /libroute/if_nameindex.c

1 #include "unpifi.h"

2 #include "unproute.h"

3 struct if_nameindex*

4 if_nameindex(void)

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 struct if_nameindex *result, *ifptr;

12 char *namptr;

13 if ((buf = net_it_iflist(0, 0, &len)) == NULL)

14 return (NULL);

15 if ((result = malloc(len)) == NULL) /* завышенная оценка */

16 return (NULL);

17 ifptr = result;

18 namptr = (char*)result + len; /* имена начинаются с конца буфера */

19 lim = buf + len;

20 for (next = buf; next ifm_msglen) {

21 ifm = (struct if_msghdr*)next;

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

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

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

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

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

27 sdl = (struct sockaddr_in*)sa;

28 namptr -= sdl->sdl_nlen + 1;

29 strncpy(namptr, &sdl->sdl_data[0], sdl->sdl_nlen);

30 namptr[sdl->sdl_nlen] = 0; /* завершающий нуль */

31 ifptr->if_name = namptr;

32 ifptr->if_index = sdl->sdl_index;

33 ifptr++;

34 }

35 }

36 }

37 }

38 ifptr->if_name = NULL; /* отмечаем конец массива структур */

39 ifptr->if_index = 0;

40 free(buf);

41 return (result); /* вызывающий процесс должен освободить память

с помощью free(), когда все сделано */

43 }

Получение списка интерфейсов, выделение места для результата

13-18 Мы вызываем нашу функцию net_rt_iflistдля возвращения списка интерфейсов. Мы также используем возвращаемый размер в качестве размера буфера, который мы размещаем в памяти для записи массива возвращаемых структур if_nameindex. Оценка необходимого размера буфера несколько завышена, но это проще, чем проходить список интерфейсов дважды: один раз для подсчета числа интерфейсов и общего размера имен, а второй — для записи этой информации. Мы создаем массив if_nameindexв начале этого буфера и записываем имена интерфейсов, начиная с конца буфера.

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

22-36 Мы обрабатываем все сообщения, ища сообщения RTM_IFINFOи следующие за ними структуры адреса сокета. Имя и индекс интерфейса записываются в создаваемый нами массив.

Завершение массива

38-39 Последняя запись в массиве имеет пустой указатель if_nameи нулевой индекс.

Функция if_freenameindex

Последняя функция, показанная в листинге 18.13, освобождает память, которая была выделена для массива структур if_nameindexи хранящихся в нем имен.

Листинг 18.14. Освобождение памяти, выделенной функцией if_nameindex

43 void

44 if_freenameindex(struct if_nameindex *ptr)

45 {

46 free(ptr);

47 }

Эта функция тривиальна, поскольку мы хранили и массив структур, и имена в одном и том же буфере. Если бы мы каждый раз вызывали функцию malloc, то для освобождения памяти нам бы пришлось проходить через весь массив, освобождать память, выделенную для каждого имени, а затем удалять сам массив (используя функцию free).

18.7. Резюме

Последняя из структур адреса сокета, с которой мы встретились в книге, это sockaddr_dl— структура адреса сокета канального уровня, имеющая переменную длину. Ядра Беркли-реализаций связывают их с интерфейсами, возвращая в одной из этих структур индекс интерфейса, его имя и аппаратный адрес.

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

Интервал:

Закладка:

Сделать

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

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


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

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

x