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

Шрифт
Интервал

, получим следующий вывод:

>solaris % ping 224.0.0.1

>PING 224.0.0.1: 56 data bytes

>64 bytes from 192.168.42.2: icmp_seq=0 ttl=255 time=0 ms

>64 bytes from 192.168.42.1: icmp_seq=0 ttl=64 time=1 ms (DUP!)

>^C

>----224.0.0.1 PING Statistics----

>1 packets transmitted. 1 packets received. +1 duplicates. 0% packet loss

>round-trip min/avg/max = 0/0/0 ms

Ответили оба узла в правой сети Ethernet на рис. 1.7.

ПРИМЕЧАНИЕ

Для предотвращения определенных типов атак некоторые системы не отвечают на широковещательные и многоадресные ICMP-запросы. Чтобы получить ответ от freebsd, нам пришлось специально настроить эту систему:

>freebsd % sysctl net.inet.icmp.bmcastecho=1

21.5. Величина 1 073 741 824 преобразуется в значение с плавающей точкой и делится на 4 294 967 296, что дает значение 0,250. В результате умножения на 1 000 000 получаем значение 250 000 в микросекундах, а это одна четверть секунды. Наибольшая дробная часть получается при делении 4 294 967 295 на 429 4967 296 и составляет 0,99 999 999 976 716 935 634. Умножая это число на 1 000 000 и отбрасывая дробную часть, получаем 999 999 — наибольшее значение количества микросекунд.

Глава 22

22.1. Вспомните, что функция >sock_ntop использует свой собственный статический буфер для хранения результата. Если мы вызовем ее дважды в качестве аргумента в вызове >printf, второй вызов приведет к перезаписи результата первого вызова.

22.2. Да, если ответ содержит 0 байт пользовательских данных (например, структура >hdr).

22.3. Поскольку функция >select не изменяет структуру >timeval, которая определяет ее ограничение по времени, нам следует заметить время отправки первого пакета (оно возвращается в миллисекундах функцией >rtt_ts). Если функция >select сообщает, что сокет готов к чтению, заметьте текущее время, а если функция >recvmsg вызывается повторно, вычислите новый тайм-аут для функции >select.

22.4. Обычным решением будет создать по одному сокету на каждый адрес интерфейса, как было сделано в разделе 22.6, и отправлять ответ с того же сокета, на который пришел запрос.

22.5. Вызов функции >getaddrinfо без аргумента имени узла и без флага >AI_PASSIVE заставляет эту функцию считать, что используется локальный адрес 0::1 (для IPv6) или 127.0.0.1 (для IPv4). Напомним, что структура адреса сокета IPv6 возвращается функцией >getaddrinfo перед структурой адреса сокета IPv4 при условии, что поддерживается протокол IPv6. Если узел поддерживает оба протокола, вызов функции socket в >udp_client закончится успешно при указании семейства протоколов >AF_INET6.

В листинге Д.9 приведена не зависящая от протокола версия программы.

Листинг Д.9. Не зависящая от протокола версия программы из раздела 22.6

>//advio/udpserv04.c

> 1 #include "unpifi.h"


> 2 void mydg_echo(int, SA*, socklen_t);


> 3 int

> 4 main(int argc, char **argv)

> 5 {

> 6  int sockfd, family, port;

> 7  const int on = 1;

> 8  pid_t pid;

> 9  socklen_t salen;

>10  struct sockaddr *sa, *wild;

>11  struct ifi_info *ifi, *ifihead;


>12  if (argc == 2)

>13   sockfd = Udp_client(NULL, argv[1], (void**)&sa, &salen);

>14  else if (argc == 3)

>15   sockfd = Udp_client(argv[1], argv[2], (void**)&sa, &salen);

>16  else

>17   err_quit("usage; udpserv04 [ ] ");

>18  family = sa->sa_family;

>19  port = sock_get_port(sa, salen);

>20  Close(sockfd); /* хотим узнать семейство, порт salen */


>21  for (ifihead = ifi = Get_ifi_info(family, 1),

>22   ifi ! = NULL; ifi = ifi->ifi_next) {


>23   /* связывание с многоадресными адресами */

>24   sockfd = Socket(family, SOCK_DGRAM, 0);

>25   Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));


>26   sock_set_port(ifi->ifi_addr, salen, port);

>27   Bind(sockfd, ifi->ifi_addr, salen);

>28   printf("bound %s\n", Sock_ntop(ifi->ifi_addr, salen));


>29   if ((pid = Fork()) == 0) { /* дочерний процесс */

>30    mydg_echo(sockfd, ifi->ifi_addr, salen);

>31    exit(0); /* никогда не выполняется */

>32   }

>33   if (ifi->ifi_flags & IFF_BROADCAST) {

>34    /* попытка связывания с широковещательным адресом */

>35    sockfd = Socket(family, SOCK_DGRAM, 0);

>36    Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));


>37    sock_set_port(ifi->ifi_brdaddr, salen, port);

>38    if (bind(sockfd, ifi->ifi_brdaddr, salen) < 0) {

>39     if (errno == EADDRINUSE) {

>40      printf("EADDRINUSE: %s\n",

>41       Sock_ntop(ifi->ifi_brdaddr, salen));

>42      Close(sockfd);

>43      continue;

>44     } else

>45      err_sys("bind error for %s",

>46     Sock_ntop(ifi->ifi_brdaddr, salen));

>47    }

>48    printf ("bound %s\n", Sock_ntop(ifi->ifi_brdaddr, salen));


>49    if ((pid = Fork()) == 0) { /* дочерний процесс */

>50     mydg_echo(sockfd, ifi->ifi_brdaddr, salen);

>51     exit(0); /* никогда не выполняется */

>52    }

>53   }

>54  }


>55  /* связывание с универсальным адресом */

>56  sockfd = Socket(family, SOCK_DGRAM, 0);

>57  Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));


>58  wild = Malloc(salen);

>59  memcpy(wild, sa, salen); /* копирует семейство и порт */

>60  sock_set_wild(wild, salen);


>61  Bind(sockfd, wild, salen);

>62  printf("bound %s\n", Sock_ntop(wild, salen));


>63  if ((pid = Fork()) == 0) { /* дочерний процесс */


Еще от автора Уильям Ричард Стивенс
UNIX: взаимодействие процессов

Книга написана известным экспертом по операционной системе UNIX и посвящена описанию одной из форм межпроцессного взаимодействия, IPC, с использованием которой создается большинство сложных программ. В ней описываются четыре возможности разделения решаемых задач между несколькими процессами или потоками одного процесса: передача сообщений, синхронизация, разделяемая память, удаленный вызов процедур.Книга содержит большое количество иллюстрирующих примеров и может использоваться как учебник по IPC, и как справочник для опытных программистов.


Рекомендуем почитать
Яйцо кукушки или Преследуя шпиона в компьютерном лабиринте

В отличие от плохого танцора, хорошему сисадмину мешают только кукушкины яйца. Их откладывают в его компьютер злобные хакеры, чтобы из них вылупились программы, делающие своего папу-кукушку суперпользователем. Но сколько кабелю не виться — а кончику быть: бравый сисадмин не дремлет и за годик-другой выводит злоумышленников на чистую воду: на этот раз хакерская тусовка круто пролетела. Такого предельно краткое содержание классической книги эксперта по компьютерной безопасности Клиффа Столла «Яйцо кукушки».


Разработка приложений в среде Linux

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек.


Это ваше Fido

Одно из немногих изданий на русском языке, которое посвящено старейшей глобальной компьютерной сети "Fidonet". Сатирический справочник о жизни и смерти самого древнего сетевого сообщества, которое до сих пор существует среди нас.


Безопасность информационных систем

В пособии излагаются основные тенденции развития организационного обеспечения безопасности информационных систем, а также подходы к анализу информационной инфраструктуры организационных систем и решению задач обеспечения безопасности компьютерных систем.Для студентов по направлению подготовки 230400 – Информационные системы и технологии (квалификация «бакалавр»).


Документация NetAMS

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Just for fun. Рассказ нечаянного революционера

Все началось с того, что студенту захотелось написать собственную программу эмуляции терминала. Потом он принялся развивать и дополнять ее и вдруг заметил, что у него получилась операционная система. Линус назвал ее Linux и поместил в Интернете, призвав желающих вносить в систему изменения. И программисты всех стран, объединившись, стали над ней трудиться.«Just for fun» – смесь автобиографии с рассуждениями о технологиях и путях их развития. Для читателей, неискушенных в программировании, Торвальдс разворачивает увлекательную историю своей жизни.


Секреты кроя и шитья без примерок и подгонок

На страницах этой книги вы найдете подробные описания и пояснения к разбору моделей и основным законам конструирования и моделирования, начиная со снятия мерок и кончая созданием завершенного варианта чертежа выкройки. Автор виртуозно привязывает каждое изделие к индивидуальной фигуре с ее неповторимым рельефом. Благодаря советам Галии Злачевской вы сможете понять и повторить ее действия и в итоге комфортно и красиво одеть любую фигуру. Цель работы автора – практическое воплощение предлагаемой идеи в одежду на конкретного человека.


Оригами

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


Первичная консультация. Установление контакта и завоевание доверия

В руководстве, написанном известными специалистами, психологом Сарой Файн и социальным работником Полом Глассером, рассматриваются закономерности и особенности начального этапа взаимодействия консультанта и клиента. Детально описаны динамика психотерапевтического процесса и приемы установления контакта и завоевания доверия во время первичной консультации различных групп клиентов, как добровольных, так и недобровольных.Книга предназначена как для начинающих, так и для опытных специалистов, в задачи которых входит оказание помощи другим людям: психологам, социальным работникам, юристам, педагогам и т. д.


Лучшие модели на любую фигуру без примерок и подгонок

Книга представляет собой сборник, который содержит схемы построения чертежей из двух предыдущих бестселлеров автора, а также предлагает ряд новых моделей. Галия Злачевская – автор эксклюзивной методики конструирования швейных изделий. Особенность ее метода в том, что вариант построения модели подбирается с учетом особенностей силуэта фигуры, поэтому крой сразу получается точным. И главное – больше никаких примерок и подгонок! Следуя простым рекомендациям автора, вы легко сможете «шаг за шагом» освоить эту методику и в итоге – получите идеально сидящую вещь.Вы научитесь создавать современные, неповторимые и оригинальные модели для мужчин, женщин, детей и даже малышей до 3 лет с минимальными затратами времени и сил.