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

Интервал:

Закладка:

Сделать

12 err_quit("pcap_lookup: %s", errbuf);

13 }

14 printf("device = %s\n", device);

15 /* жестко задано; promisc=0, to_ms=500 */

16 if ((pd = pcap_open_live(device, snaplen, 0, 500, errbuf)) == NULL)

17 err_quit("pcap_open_live: %s", errbuf);

18 if (pcap_lookupnet(device, &localnet, &netmask, errbuf)

19 err_quit("pcap_lookupnet %s", errbuf);

20 if (verbose)

21 printf("localnet = %s, netmask = %s\n",

22 Inet_ntop(AF_INET, &localnet, str1, sizeof(str1)),

23 Inet_ntop(AF_INET, &netmask. str2, sizeof(str2)));

24 snprintf(cmd, sizeof(cmd), CMD,

25 Sock_ntop_host(dest, destlen),

26 ntohs(sock_get_port(dest, destlen)));

27 if (verbose)

28 printf("cmd = %s\n", cmd);

29 if (pcap_compile(pd, &fcode, cmd, 0, netmask)

30 err_quit("pcap_compile: %s", pcap_geterr(pd));

31 if (pcap_setfilter(pd, &fcode)

32 err_quit("pcap_setfilter: %s", pcap_geterr(pd));

33 if ((datalink = pcap_datalink(pd))

34 err_quit("pcap_datalink: %s", pcap_geterr(pd));

35 if (verbose)

36 printf("datalink = %d\n", datalink);

37 }

Выбор устройства для захвата пакетов

10-14 Если устройство для захвата пакетов не было задано (с помощью параметра командной строки -i), то выбор этого устройства осуществляется с помощью функции pcap_lookupdev. С помощью запроса SIOCGIFCONFфункции ioctlвыбирается включенное устройство с минимальным порядковым номером, но только не устройство обратной связи. Многие из библиотечных функций pcapвозвращают сообщения об ошибках в виде строк. Единственным аргументом функции pcap_lookupdevявляется массив, в который записывается строка с сообщением об ошибке.

Открываем устройство

15-17 Функция pcap_open_liveоткрывает устройство. Слово liveприсутствует в названии функции потому, что здесь имеется в виду фактическое устройство для захвата пакетов, а не файл, содержащий предыдущие сохраненные пакеты. Первым аргументом функции является имя устройства, вторым — количество байтов, которое нужно сохранять для каждого пакета (значение shaplen, которое мы инициализировали числом 200 в листинге 29.2), а третий аргумент — это флаг, указывающий на смешанный режим. Четвертый аргумент — это значение времени ожидания в миллисекундах, а пятый — указатель на массив, содержащий сообщения об ошибках.

Если установлен флаг смешанного режима, интерфейс переходит в этот режим, в результате чего он принимает все пакеты, проходящие по кабелю. Это обычное состояние программы tcpdump. Тем не менее в нашем примере ответы сервера DNS будут посланы непосредственно на наш узел (то есть можно обойтись без смешанного режима).

Четвертый аргумент — время ожидания при считывании. Вместо того чтобы возвращать пакет процессу каждый раз, когда приходит очередной пакет (что может быть весьма неэффективно, так как в этом случае потребуется выполнять множество операций копирования отдельных пакетов из ядра в процесс), это делается, когда считывающий буфер устройства оказывается заполненным либо когда истекает время ожидания. Если время ожидания при считывании равно нулю, то каждый пакет будет переправляться процессу, как только будет получен.

Получение сетевого адреса и маски подсети

18-23 Функция pcap_lookupnetвозвращает сетевой адрес и маску подсети для устройства захвата пакетов. При вызове функции pcap_compile, которая будет вызвана следующей, нужно задать маску подсети, поскольку с помощью маски фильтр пакетов определяет, является ли IP-адрес адресом широковещательной передачи для данной подсети.

Компиляция фильтра пакетов

24-30 Функция pcap_compileполучает строку, построенную нами как массив cmd, и компилирует ее, создавая тем самым программу для фильтрации (записывая ее в fcode). Эта программа будет отбирать те пакеты, которые мы хотим получить.

Загрузка программы фильтрации

31-32 Функция pcap_setfilterполучает только что скомпилированную программу фильтрации и загружает ее в устройство для захвата пакетов. Таким образом инициируется захват пакетов, выбранных нами путем настройки фильтра.

Определение типа канального уровня

33-36 Функция pcap_datalinkвозвращает тип канального уровня для устройства захвата пакетов. Эта информация нужна нам при захвате пакетов для того, чтобы определить размер заголовка канального уровня, который будет добавлен в начало каждого считываемого нами пакета (см. листинг 29.10).

После вызова функции open_pcapфункция main вызывает функцию test_udp, показанную в листинге 29.6. Эта функция посылает запрос DNS и считывает ответ сервера.

Листинг 29.6. Функция test_udp: отправка запросов и считывание ответов

//udpcksum/udpcksum.c

12 void

13 test_udp(void)

14 {

15 volatile int nsent = 0, timeout = 3;

16 struct udpiphdr *ui;

17 Signal(SIGALRM, sig_alrm);

18 if (sigsetjmp(jmpbuf, 1)) {

19 if (nsent >= 3)

20 err_quit("no response");

21 printf("timeout\n");

22 timeout *= 2; /* геометрическая прогрессия: 3, 6, 12 */

23 }

24 canjump = 1; /* siglongjmp разрешен */

25 send_dns_query();

26 nsent++;

27 alarm(timeout);

28 ui = udp_read();

29 canjump = 0;

30 alarm(0);

31 if (ui->ui_sum == 0)

32 printf("UDP checksums off\n");

33 else

34 printf("UDP checksums on\n");

35 if (verbose)

36 printf("received UDP checksum = %x\n", ntohs(ui->ui_sum));

37 }

Переменные volatile

15 Нам нужно, чтобы две динамические локальные переменные nsentи timeoutсохраняли свои значения после возвращения siglongjmpиз обработчика сигнала в нашу функцию. Реализация допускает восстановление значений динамических локальных переменных, предшествовавших вызову функции sigsetjump[110, с. 178], но добавление спецификатора volatileпредотвращает это восстановление.

Установление обработчика сигналов и буфера перехода

15-16 Для сигнала SIGALRMустанавливается обработчик сигнала, а функция sigsetjmpустанавливает буфер перехода для функции siglongjmp. (Эти две функции подробно описаны в разделе 10.15 [110].) Значение 1 во втором аргументе функции sigsetjmpуказывает, что требуется сохранить текущую маску сигнала, так как мы будем вызывать функцию siglongjmpиз нашего обработчика сигнала.

Функция siglongjmp

19-23 Этот фрагмент кода выполняется, только когда функция siglongjmpвызывается из нашего обработчика сигнала. Вызов указывает на возникновение условий, при которых мы входим в состояние ожидания: мы отправили запрос, на который не пришло никакого ответа. Если после того, как мы отправим три запроса, ответа не будет, мы прекращаем выполнение кода. По истечении времени ожидания, отведенного на получение ответа, мы выводим соответствующее сообщение и увеличиваем значение времени ожидания в два раза, то есть задаем экспоненциальное смещение ( exponential backoff ), которое также описано в разделе 20.5. Первое значение времени ожидания равно 3 с, затем — 6 с и 12 с.

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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