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

Интервал:

Закладка:

Сделать

38 verbose = 1;

39 break;

40 case '?':

41 usage("unrecognized option");

42 }

43 }

Обработка аргументов командной строки

20-25 Мы вызываем функцию getoptдля обработки аргументов командной строки. С помощью параметра -0мы посылаем запросы UDP без контрольной суммы UDP, чтобы выяснить, обрабатываются ли эти дейтаграммы сервером иначе, чем дейтаграммы с контрольной суммой.

26 Параметр -iпозволяет нам задать интерфейс, на котором будут приниматься ответы сервера. Если этот интерфейс не будет задан, библиотека для захвата пакетов выберет какой-либо интерфейс самостоятельно, но в случае узла с несколькими сетевыми интерфейсами этот выбор может оказаться некорректным. В этом заключается одно из различий между считыванием из обычного сокета и из устройства для захвата пакетов: в первом случае мы можем указать универсальный локальный адрес, что позволяет получать пакеты, прибывающие на любой из сетевых интерфейсов. Но во втором случае при работе с устройством для захвата пакетов мы можем получать пакеты, прибывающие только на конкретный интерфейс.

ПРИМЕЧАНИЕ

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

29-36 Параметр -lпозволяет нам задать IP-адрес отправителя и номер порта. В качестве номера порта (или названия службы) берется строка, следующая за последней точкой, а IP-адресом является все, что расположено перед последней точкой.

Последняя часть функции mainпоказана в листинге 29.4.

Листинг 29.4. Функция main: преобразование имен узлов и названий служб, создание сокета

//udpcksum/main.c

44 if (optind != argc-2)

45 usage("missing and/or ");

46 /* преобразование имени получателя и службы */

47 aip = Host_serv(argv[optind], argv[optind+1], AF_INET, SOCK_DGRAM);

48 dest = aip->ai_addr; /* не освобождаем память при помощи freeaddrinfo() */

49 destlen = aip->ai_addrlen;

50 /*

51 * Нужен локальный IP-адрес для указания в UDP-дейтаграммах.

52 * Нельзя задать 0 и предоставить выбор уровню IP,

53 * потому что адрес нужен для вычисления контрольной суммы.

54 * Если указан параметр -1, используем заданные при вызове значения.

55 * в противном случае соединяем сокет UDP с адресатом и определяем

56 * правильный адрес отправителя.

57 */

58 if (lopt) {

59 /* преобразование локального имени и сервиса */

60 aip = Host_serv(localname, localport, AF_INET, SOCK_DGRAM);

61 local = aip->ai_addr; /* не вызываем freeaddrinfo() */

62 locallen = aip->ai_addrlen;

63 } else {

64 int s;

65 s = Socket(AF_INET, SOCK_DGRAM, 0);

66 Connect(s, dest, destlen);

67 /* ядро выбирает правильный локальный адрес */

68 locallen = sizeof(locallookup);

69 local = (struct sockaddr*)&locallookup;

70 Getsockname(s, local, &locallen);

71 if (locallookup.sin_addr.s_addr == htonl(INADDR_ANY))

72 err_quit("Can't determine local address - use -l\n");

73 close(s);

74 }

75 open_output(); /* открываем поток вывода (символьный сокет или libnet) */

76 open_pcap(); /* открываем устройство захвата пакетов */

77 setuid(getuid()); /* права привилегированного пользователя больше

не нужны */

78 Signal(SIGTERM, cleanup);

79 Signal(SIGINT, cleanup);

80 Signal(SIGHUP, cleanup);

81 test_udp();

82 cleanup(0);

83 }

Обработка имени узла и порта получателя, затем локального имени узла и порта

46-49 Мы убеждаемся, что остается ровно два аргумента командной строки: имя узла получателя и название службы. Мы вызываем функцию host_servдля преобразования их в структуру адреса сокета, указатель на которую мы сохраняем в переменной dest.

Обработка локального имени и порта

50-74 Если в командной строке был указан соответствующий параметр, мы преобразуем имя локального узла и номер порта, сохраняя указатель на структуру адреса сокета под именем local. В противном случае для определения локального IP-адреса мы подключаемся через дейтаграммный сокет к нужному адресату и сохраняем полученный при этом локальный адрес под тем же именем local. Поскольку мы формируем собственные заголовки IP и UDP, мы должны знать IP-адрес отправителя при записи дейтаграммы UDP. Нельзя оставить адрес нулевым и предоставить уровню IP выбрать его самостоятельно, потому что адрес является частью псевдозаголовка UDP (о котором мы вскоре расскажем), используемого при вычислении контрольной суммы UDP.

Создаем символьный сокет и открываем устройство для захвата пакетов

75-76 Функция open_output выбирает метод отправки пакетов (символьный сокет или libnet). Функция open_pcapоткрывает устройство захвата пакетов. Она будет рассмотрена далее.

Изменение прав и установка обработчиков сигналов

77-80 Для создания символьного сокета необходимо иметь права привилегированного пользователя. Обычно такие привилегии нужны нам для того, чтобы открыть устройство для захвата пакетов, но это зависит от реализации. Например, в случае BPF администратор может установить разрешения для устройств /dev/bpfлюбым способом в зависимости от того, что требуется для данной системы. Здесь мы не используем эти дополнительные разрешения, предполагая, что для файла программы установлен бит SUID. Процесс выполняется с правами привилегированного пользователя, а когда они становятся не нужны, при вызове функции setuid фактический идентификатор пользователя (real user ID), эффективный идентификатор пользователя (effective user ID) и сохраненный SUID принимают значение фактического идентификатора пользователя ( getuid). Мы устанавливаем обработчики сигналов на тот случай, если пользователь завершит программу раньше, чем будут изменены права.

Выполнение теста и очистка

81-82 Функция test_udp(см. листинг 29.6) выполняет тестирование и возвращает управление. Функция cleanup(см. листинг 29.14) выводит итоговую статистику библиотеки захвата пакетов, а затем завершает процесс.

В листинге 29.5 показана функция open_pcap, которую мы вызвали из функции main, чтобы открыть устройство для захвата пакетов.

Листинг 29.5. Функция open_pcap: открытие и инициализация устройства для захвата пакетов

//udpcksum/pcap.c

1 #include "udpcksum.h"

2 #define CMD "udp and src host %s and src port %d"

3 void

4 open_pcap(void)

5 {

6 uint32_t localnet, netmask;

7 char cmd[MAXLINE], errbuf[PCAP_ERRBUF_SIZE], strl[INET_ADDRSTRLEN],

8 str2[INET_ADDRSTRLEN];

9 struct bpf_program fcode;

10 if (device == NULL) {

11 if ((device = pcap_lookupdev(errbuf)) == NULL)

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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