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

Тут можно читать онлайн Уильям Стивенс - UNIX: разработка сетевых приложений - бесплатно ознакомительный отрывок. Жанр: comp-osnet, издательство Питер, год 2007. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    UNIX: разработка сетевых приложений
  • Автор:
  • Жанр:
  • Издательство:
    Питер
  • Год:
    2007
  • Город:
    Санкт-Петербург
  • ISBN:
    5-94723-991-4
  • Рейтинг:
    4.33/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

UNIX: разработка сетевых приложений - описание и краткое содержание, автор Уильям Стивенс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

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

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

UNIX: разработка сетевых приложений - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Уильям Стивенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

#include "unp.h"

int mcast_join(int sockfd , const struct sockaddr * grp ,

socklen_t grplen , const char * ifname , u_int ifindex );

int mcast_leave(int sockfd , const struct sockaddr * grp ,

socklen_t grplen );

int mcast_block_source(int sockfd ,

const struct sockaddr * src , socklen_t srclen ,

const struct sockaddr * grp , socklen_t grplen );

int mcast_unblock_source(int sockfd ,

const struct sockaddr * src , socklen_t srclen ,

const struct sockaddr * grp , socklen_t grplen );

int mcast_join_source_group(int sockfd ,

const struct sockaddr * src , socklen_t srclen ,

const struct sockaddr * grp , socklen_t grplen ,

const char * ifname , u_int ifindex );

int mcast_leave_source_group(int sockfd ,

const struct sockaddr * src , socklen_t srclen ,

const struct sockaddr * grp , socklen_t grplen );

int mcast_set_if(int sockfd , const char * ifname , u_int ifindex );

int mcast_set_loop(int sockfd , int flag );

int mcast_set_ttl(int sockfd , int ttl );

Все перечисленные выше функции возвращают: 0 в случае успешного выполнения, -1 в случае ошибки

int mcast_get_if(int sockfd );

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

int mcast_get_loop(int sockfd );

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

int mcast_get_ttl(int sockfd );

Возвращает: текущее значение TTL или предельное количество транзитных узлов в случае успешного выполнения, -1 в случае ошибки

Функция mcast_joinприсоединяет узел к группе. IP-адрес этой группы содержится в структуре адреса сокета, на которую указывает аргумент grp, а длина этой структуры задается аргументом grplen. Мы можем задать интерфейс, на котором должно происходить присоединение к группе, либо через имя интерфейса (непустой аргумент ifname), либо через ненулевой индекс интерфейса (непустой аргумент ifindex). Если ни одно из этих значений не задано, ядро самостоятельно выбирает интерфейс, на котором происходит присоединение к группе. Вспомните, что в случае IPv6 для работы с параметрами сокета интерфейс задается по его индексу. Если для сокета IPv6 известно имя интерфейса, нужно вызвать функцию if_nametoindex, чтобы получить индекс интерфейса. В случае параметра сокета IPv4 мы задаем интерфейс по его IP-адресу направленной передачи. Если для сокета IPv4 интерфейс задан по имени, нужно вызвать функцию ioctlс запросом SIOCGIFADDRдля получения IP-адреса направленной передачи для этого интерфейса. Если для сокета IPv4 задан индекс интерфейса, мы сначала вызываем функцию if_indextoname, чтобы получить имя интерфейса, а затем обрабатываем имя так, как только что было сказано.

ПРИМЕЧАНИЕ

Пользователи обычно задают имя интерфейса le0 или ether0, а IP-адрес и индекс интерфейса не используются. Например, tcpdump является одной из немногих программ, позволяющих пользователю задавать интерфейс, а ее параметр -i принимает имя интерфейса в качестве аргумента.

Функция mcast_leaveвыводит узел из группы с IP-адресом, содержащимся в структуре адреса сокета, на которую указывает аргумент grp.

Функция mcast_block_sourceблокирует получение через конкретный сокет пакетов, относящихся к определенной группе и исходящих от определенного источника. IP-адреса группы и источника хранятся в структурах адреса сокета, на которые указывают аргументы grpи srcсоответственно. Длины структур задаются параметрами srclenи grplen. Для успешного завершения функции необходимо, чтобы до ее вызова уже была вызвана функция mcast_joinдля того же сокета и той же группы.

Функция mcast_unblock_sourceразблокирует получение трафика от источника из заданной группы. Аргументы src, srclen, grpи grplenимеют тот же смысл, что и аргументы предыдущей функции, и должны совпадать с ними по значениям.

Функция mcast_join_source_groupвыполняет присоединение к группе источника. Адрес источника и адрес группы содержатся в структурах адреса сокета, на которые указывают аргументы srcи grp. Длины структур задаются параметрами srclenи grplen. Интерфейс, присоединяемый к группе, может быть задан именем (ненулевой аргумент ifname) или индексом ( ifindex). Если интерфейс не задан явно, ядро выбирает его самостоятельно.

Функция mcast_leave_source_groupвыполняет отсоединение от группы источника. Адреса источника и группы содержатся в структурах адреса сокета, на которые указывают аргументы srcи grp. Длины структур задаются параметрами srclenи grplen. Подобно mcast_leave, mcast_leave_source_groupне требует указания интерфейса: она всегда отсоединяет от группы первый интерфейс, удовлетворяющий условиям.

Функция mcast_set_ifустанавливает индекс интерфейса по умолчанию для исходящих дейтаграмм многоадресной передачи. Если аргумент ifnameнепустой, он задает имя интерфейса. Иначе положительное значение аргумента ifindexбудет задавать индекс интерфейса. В случае IPv6 имя сопоставляется индексу с использованием функции if_nametoindex. В случае IPv4 сопоставление имени или индекса IP-адресу направленной передачи интерфейса происходит так же, как для функции mcast_join.

Функция mcast_set_loopустанавливает параметр закольцовки либо в 0, либо в 1, а функция mcast_set_ttlTTL в случае IPv4 или предел количества транзитных узлов в случае IPv6. Функции mcast_get_XXXвозвращают соответствующие значения.

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

В листинге 21.1 [1] Все исходные коды программ, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com. показана первая часть функции mcast_join. Эта часть демонстрирует простоту интерфейса программирования, не зависящего от протокола.

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

//lib/mcast_join.c

1 #include "unp.h"

2 #include

3 int

4 mcast_join(int sockfd, const SA *grp, socklen_t grplen,

5 const char *ifname, u_int ifindex)

6 {

7 #ifdef MCAST_JOIN_GROUP

8 struct group_req req;

9 if (ifindex > 0) {

10 req.gr_interface = ifindex;

11 } else if (ifname != NULL) {

12 if ((req.gr_interface = if_nametoindex(ifname)) == 0) {

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

14 return(-1);

15 }

16 } else

17 req.gr_interface = 0;

18 if (grplen > sizeof(req.gr_group)) {

19 errno = EINVAL;

20 return -1;

21 }

22 memcpy(&req.gr_group, grp, grplen);

23 return (setsockopt(sockfd, family_to_level(grp->sa_family),

24 MCAST_JOIN_GROUP, &req, sizeof(req)));

25 #else

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

9-17 Если при вызове был указан индекс интерфейса, функция использует его непосредственно. В противном случае (при указании имени интерфейса), имя преобразуется в индекс вызовом if_nametoindex. Если ни имя, ни индекс не заданы, интерфейс выбирается ядром.

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

Интервал:

Закладка:

Сделать


Уильям Стивенс читать все книги автора по порядку

Уильям Стивенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге UNIX: разработка сетевых приложений, автор: Уильям Стивенс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x