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

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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

12-15 Мы динамически размещаем в памяти буфер начиная с размера, достаточного для 100 структур ifreq. Мы также отслеживаем длину, возвращаемую последним вызовом SIOCGIFCONFв lastlen, и инициализируем ее нулем.

19-20 Если функция ioctlвозвращает ошибку EINVALи функция еще не возвращалась успешно (то есть lastlenвсе еще равно нулю), значит, мы еще не выделили буфер достаточного размера, поэтому мы продолжаем выполнять цикл.

22-23 Если функция ioctlзавершается успешно и возвращаемая длина равна lastlen, значит, длина не изменилась (наш буфер имеет достаточный размер), и мы с помощью функции breakвыходим из цикла, так как у нас имеется вся информация.

26-27 В каждом проходе цикла мы увеличиваем размер буфера для хранения еще 10 структур ifreq.

Инициализация указателей связного списка

29-31 Поскольку мы будем возвращать указатель на начало связного списка структур ifi_info, мы используем две переменные ifiheadи ifipnextдля хранения указателей на список по мере его создания.

Следующая часть нашей функции get_ifi_info, содержащая начало основного цикла, показана в листинге 17.5.

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

//lib/get_ifi_info.c

34 for (ptr = buf; ptr

35 ifr = (struct ifreq*)ptr;

36 #ifdef HAVE_SOCKADDR_SA_LEN

37 len = max(sizeof(struct sockaddr), ifr->ifr_addr.sa_len);

38 #else

39 switch (ifr->ifr_addr.sa_family) {

40 #ifdef IPV6

41 case AF_INET6:

42 len = sizeof(struct sockaddr_in6);

43 break;

44 #endif

45 case AF_INET:

46 default:

47 len = sizeof(struct sockaddr);

48 break;

49 }

50 #endif /* HAVE_SOCKADDR_SA_LEN */

51 ptr += sizeof(ifr->ifr_name) + len; /* для следующей строки */

52 #ifdef HAVE_SOCKADDR_DL_STRUCT

53 /* предполагается, что AF_LINK идет перед AF_INET и AF_INET6 */

54 if (ifr->ifr_addr.sa_family == AF_LINK) {

55 struct sockaddr_dl *sdl = (struct sockaddr_dl*)&ifr->ifr_addr;

56 sdlname = ifr->ifr_name;

57 idx = sdl->sdl_index;

58 haddr = sdl->sdl_data + sdl->sdl_nlen;

59 hlen = sdl->sdl_alen;

60 }

61 #endif

62 if (ifr->ifr_addr.sa_family != family)

63 continue; /* игнорируется, если семейство адреса не то */

64 myflags = 0;

65 if ((cptr = strchr(ifr->ifr_name, ':')) != NULL)

66 *cptr = 0; /* замена двоеточия нулем */

67 if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0) {

68 if (doaliases == 0)

69 continue; /* этот интерфейс уже обработан */

70 myflags = IFI_ALIAS;

71 }

72 memcpy(lastname, ifr->ifr_name, IFNAMSIZ);

73 ifrcopy = *ifr;

74 Ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);

75 flags = ifrcopy.ifr_flags;

76 if ((flags & IFF_UP) == 0)

77 continue; /* игнорируется, если интерфейс не используется */

Переход к следующей структуре адреса сокета

35-51 При последовательном просмотре всех структур i freq ifrуказывает на текущую структуру, а мы увеличиваем ptrна единицу, чтобы он указывал на следующую. Необходимо предусмотреть особенность более новых систем, предоставляющих поле длины для структур адреса сокета, и вместе с тем учесть, что более старые системы этого поля не предоставляют. Хотя в листинге 17.1 структура адреса сокета, содержащаяся в структуре ifreq, объявляется как общая структура адреса сокета, в новых системах она может относиться к произвольному типу. Действительно, в 4.4BSD структура адреса сокета канального уровня также возвращается для каждого интерфейса [128, с. 118]. Следовательно, если поддерживается элемент длины, то мы должны использовать его значение для переустановки нашего указателя на следующую структуру адреса сокета. В противном случае мы определяем длину, исходя из семейства адресов, используя размер общей структуры адреса сокета (16 байт) в качестве значения по умолчанию.

ПРИМЕЧАНИЕ

В системах, поддерживающих IPv6, не оговаривается, возвращается ли адрес IPv6 вызовом SIOCGIFCONF. Для более новых систем мы вводим оператор case, в котором предусмотрена возможность возвращения адресов IPv6. Проблема состоит в том, что объединение в структуре ifreq определяет возвращаемые адреса как общие 16-байтовые структуры sockaddr, подходящие для 16-байтовых структур sockaddr_in IPv4, но для 24-байтовых структур sockaddr_in6 IPv6 они слишком малы. В случае возвращения адресов IPv6 возможно некорректное поведение существующего кода, созданного в предположении, что в каждой структуре ifreq содержится структура sockaddr фиксированного размера. В системах, где структура sockaddr имеет поле sa_len, никаких проблем не возникает, потому что такие системы легко могут указывать размер структур sockaddr.

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

Интервал:

Закладка:

Сделать

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

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


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

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

x