UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Чтобы получить дейтаграмму многоадресной передачи, процесс должен присоединиться к группе, а также связать при помощи функции
bind
bind
Исторически Беркли-реализации требуют только, чтобы некоторый сокет на узле присоединился к группе — это не обязательно тот сокет, который связывается с портом и затем получает дейтаграммы многоадресной передачи. Однако есть вероятность, что эти реализации могут доставлять дейтаграммы многоадресной передачи приложениям, не знающим о многоадресной передаче. Более новые ядра требуют, чтобы процесс связывался с портом и устанавливал какой-нибудь параметр сокета многоадресной передачи для сокета как указатель того, что приложение знает о многоадресной передаче. Самый обычный параметр сокета многоадресной передачи — признак присоединения к группе. Для Solaris 2.5 характерны некоторые отличия: дейтаграммы многоадресной передачи доставляются только на те сокеты, которые присоединились к группе и связались с портом. В целях переносимости все приложения многоадресной передачи должны присоединиться к группе и связаться с портом.
Более новый интерфейс многоадресного сервиса требует, чтобы уровень IP доставлял многоадресные пакеты сокету только в том случае, если этот сокет присоединился к группе или источнику. Такое требование было введено с IGMPv3 (RFC 3376 [16]), чтобы разрешить фильтрацию источников и многоадресную передачу от источника. Таким образом ужесточается требование на присоединение к группе, но зато ослабляется требование на связывание группового адреса. Однако для наибольшей переносимости со старыми и новыми интерфейсами приложения должны присоединяться к группам и связывать сокеты с групповыми адресами.
Некоторые более старые узлы, имеющие возможность многоадресной передачи, не позволяют связывать адрес многоадресной передачи с сокетом при помощи функции bind. В целях переносимости приложение может игнорировать ошибку функции bind при связывании адреса многоадресной передачи с сокетом и делать повторную попытку с адресом INADDR_ANY или in6addr_any.
21.7. Функция mcast_join и родственные функции
Несмотря на то что параметры сокетов многоадресной передачи для IPv4 аналогичны параметрам сокетов многоадресной передачи для IPv6, есть достаточно много различий, из-за которых не зависящий от протокола код, использующий многоадресную передачу, усложняется и содержит множество директив
#ifdef
#include "unp.h"
int mcast_join(int <i>sockfd</i>, const struct sockaddr *<i>grp</i>,
socklen_t <i>grplen</i>, const char *<i>ifname</i>, u_int <i>ifindex</i>);
int mcast_leave(int <i>sockfd</i>, const struct sockaddr *<i>grp</i>,
socklen_t <i>grplen</i>);
int mcast_block_source(int <i>sockfd</i>,
const struct sockaddr *<i>src</i>, socklen_t <i>srclen</i>,
const struct sockaddr *<i>grp</i>, socklen_t <i>grplen</i>);
int mcast_unblock_source(int <i>sockfd</i>,
const struct sockaddr *<i>src</i>, socklen_t <i>srclen</i>,
const struct sockaddr *<i>grp</i>, socklen_t <i>grplen</i>);
int mcast_join_source_group(int <i>sockfd</i>,
const struct sockaddr *<i>src</i>, socklen_t <i>srclen</i>,
const struct sockaddr *<i>grp</i>, socklen_t <i>grplen</i>,
const char *<i>ifname</i>, u_int <i>ifindex</i>);
int mcast_leave_source_group(int <i>sockfd</i>,
const struct sockaddr *<i>src</i>, socklen_t <i>srclen</i>,
const struct sockaddr *<i>grp</i>, socklen_t <i>grplen</i>);
int mcast_set_if(int <i>sockfd</i>, const char *<i>ifname</i>, u_int <i>ifindex</i>);
int mcast_set_loop(int <i>sockfd</i>, int <i>flag</i>);
int mcast_set_ttl(int <i>sockfd</i>, int <i>ttl</i>);
<i>Все перечисленные выше функции возвращают: 0 в случае успешного выполнения, -1 в случае ошибки</i>
int mcast_get_if(int <i>sockfd</i>);
<i>Возвращает: неотрицательный индекс интерфейса в случае успешного выполнения, -1 в случае ошибки</i>
int mcast_get_loop(int <i>sockfd</i>);
<i>Возвращает: текущий флаг закольцовки в случае успешного выполнения, -1 в случае ошибки</i>
int mcast_get_ttl(int <i>sockfd</i>);
<i>Возвращает: текущее значение TTL или предельное количество транзитных узлов в случае успешного выполнения, -1 в случае ошибки</i>
Функция
mcast_join
grp
grplen
ifname
ifindex
if_nametoindex
ioctl
SIOCGIFADDR
if_indextoname