UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Пользователи обычно задают имя интерфейса le0 или ether0, а IP-адрес и индекс интерфейса не используются. Например, tcpdump является одной из немногих программ, позволяющих пользователю задавать интерфейс, а ее параметр -i принимает имя интерфейса в качестве аргумента.
Функция
mcast_leave
grp
Функция
mcast_block_source
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
if_nametoindex
mcast_join
Функция
mcast_set_loop
mcast_set_ttl
mcast_get_XXX
Пример: функция mcast_join
В листинге 21.1 [1] показана первая часть функции
mcast_join
Листинг 21.1. Присоединение к группе: сокет IPv4
//lib/mcast_join.c
1 #include "unp.h"
2 #include <net/if.h>
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
18-22
sockaddr_storage
sockaddr
EINVAL
23-24
setsockopt
level
family_to_level
IPPROTO_IP
MCAST_JOIN_GROUP
AF_INET6
level