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

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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

В листинге 21.2 представлена вторая часть функции mcast_join, обрабатывающая сокеты IPv4.

Листинг 21.2. Присоединение к группе: обработка сокета IPv4

26 switch (grp->sa_family) {

27 case AF_INET: {

28 struct ip_mreq mreq;

29 struct ifreq ifreq;

30 memcpy(&mreq.imr_multiaddr,

31 &((const struct sockaddr_in*)grp)->sin_addr,

32 sizeof(struct in_addr));

33 if (ifindex > 0) {

34 if (if_indextoname(ifindex, ifreq.ifr_name) == NULL) {

35 errno = ENXIO; /* i/f index not found */

36 return(-1);

37 }

38 goto doioctl;

39 } else if (ifname != NULL) {

40 strncpy(ifreq.ifr_name, ifname, IFNAMSIZ);

41 doioctl:

42 if (ioctl(sockfd, SIOCGIFADDR, &ifreq)

43 return(-1);

44 memcpy(&mreq.imr_interface,

45 &((struct sockaddr_in*)&ifreq.ifr_addr)->sin_addr,

46 sizeof(struct in_addr));

47 } else

48 mreq.imr_interface.s_addr = htonl(INADDR_ANY);

49 return(setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,

50 &mreq, sizeof(mreq)));

51 }

Обработка индекса

33-38 Адрес многоадресной передачи IPv4 в структуре адреса сокета копируется в структуру ip_mreq. Если индекс был задан, вызывается функция if_indextoname, сохраняющая имя в нашей структуре ip_mreq. Если это выполняется успешно, мы переходим на точку вызова ioctl.

Обработка имени

39-46 Имя вызывающего процесса копируется в структуру ip_mreq, а вызов SIOCGIFADDRфункции ioctlвозвращает адрес многоадресной передачи, связанный с этим именем. При успешном выполнении адрес IPv4 копируется в элемент imr_interfaceструктуры ip_mreq.

Значения по умолчанию

47-48 Если ни индекс, ни имя не заданы, используется универсальный адрес, что указывает ядру на необходимость выбрать интерфейс.

49-50 Функция setsockoptвыполняет присоединение к группе.

Третья, и последняя, часть функции, обрабатывающая сокеты IPv6, приведена в листинге 21.3.

Листинг 21.3. Присоединение к группе: обработка сокета IPv6

52 #ifdef IPV6

53 case AF_INET6: {

54 struct ipv6_mreq mreq6;

55 memcpy(&mreq6.ipv6mr_multiaddr,

56 &((const struct sockaddr_in6*) grp)->sin6_addr,

57 sizeof(struct in6_addr));

58 if (ifindex > 0) {

59 mreq6.ipv6mr_interface = ifindex;

60 } else if (ifname != NULL) {

61 if ((mreq6.ipv6mr_interface = if_nametoindex(ifname)) == 0) {

62 errno = ENXIO; /* интерфейс не найден */

63 return(-1);

64 }

65 } else

66 mreq6.ipv6mr_interface = 0;

67 return(setsockopt(sockfd, IPPROTO_IPV6, IPV6_JOIN_GROUP,

68 &mreq6, sizeof(mreq6)));

69 }

70 #endif

71 default:

72 errno = EAFNOSUPPORT;

73 return(-1);

74 }

75 #endif

76 }

Копирование адреса

55-57 Сначала адрес IPv6 копируется из структуры адреса сокета в структуру ipv6_mreq.

Обработка индекса или имени интерфейса или выбор интерфейса по умолчанию

58-66 Если был задан индекс, он записывается в элемент ipv6mr_interface. Если индекс не задан, но задано имя, то для получения индекса вызывается функция if_nametoindex. В противном случае для функции setsockoptиндекс устанавливается в 0, что указывает ядру на необходимость выбрать интерфейс.

67-68 Выполняется присоединение к группе.

Пример: функция mcast_set_loop

В листинге 21.4 показана наша функция mcast_set_loop.

Поскольку аргументом является дескриптор сокета, а не структура адреса сокета, мы вызываем нашу функцию sockfd_to_family, чтобы получить семейство адресов сокета. Устанавливается соответствующий параметр сокета.

Мы не показываем исходный код для всех остальных функций mcast_ XXX , так как он свободно доступен в Интернете (см. предисловие).

Листинг 21.4. Установка параметра закольцовки для многоадресной передачи

//lib/mcast_set_loop.c

1 #include "unp.h"

2 int

3 mcast_set_loop(int sockfd, int onoff)

4 {

5 switch (sockfd_to_family(sockfd)) {

6 case AF_INET:{

7 u_char flag;

8 flag = onoff;

9 return (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_LOOP,

10 &flag, sizeof(flag)));

11 }

12 #ifdef IPV6

13 case AF_INET6:{

14 u_int flag;

15 flag = onoff;

16 return (setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,

17 &flag, sizeof(flag)));

18 }

19 #endif

20 default:

21 errno = EPROTONOSUPPORT;

22 return (-1);

23 }

24 }

21.8 Функция dg_cli, использующая многоадресную передачу

Мы изменяем нашу функцию dg_cli, показанную в листинге 20.1, просто удаляя вызов функции setsockopt. Как мы сказали ранее, для отправки дейтаграмм многоадресной передачи не нужно устанавливать ни одного параметра сокета многоадресной передачи, если нас устраивают заданные по умолчанию настройки интерфейса исходящих пакетов, значения TTL и параметра закольцовки. Мы запускаем нашу программу, задавая в качестве адреса получателя группу всех узлов (all-hosts group):

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

Интервал:

Закладка:

Сделать

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

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


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

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

x