Уильям Стивенс - UNIX - разработка сетевых приложений

Здесь есть возможность читать онлайн «Уильям Стивенс - UNIX - разработка сетевых приложений» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Санкт-Петербург, Год выпуска: 2007, ISBN: 2007, Издательство: Питер, Жанр: ОС и Сети, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

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

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «UNIX: разработка сетевых приложений»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

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

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

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «UNIX: разработка сетевых приложений», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

9 int rawfd; /* символьный сокет */

10 int snaplen = 200; /* объем захваченных данных */

11 int verbose;

12 int zerosum; /* отправка UDP-запроса без контрольной суммы */

13 static void usage(const char*);

14 int

15 main(int argc, char *argv[])

16 {

17 int c, lopt=0;

18 char *ptr, localname[1024], *localport;

19 struct addrinfo *aip;

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

Листинг 29.3. Функция main: обработка аргументов командной строки

//udpcksum/main.c

20 opterr = 0; /* отключаем запись сообщений getopt() в stderr */

21 while ((с = getopt(argc, argv, "0i:l:v")) != -1) {

22 switch (с) {

23 case '0':

24 zerosum = 1;

25 break;

26 case 'i';

27 device = optarg; /* устройство pcap */

28 break;

29 case 'l'; /* локальный IP адрес и номер порта; a.b.c.d.p */

30 if ((ptr = strrchr(optarg, '.')) == NULL)

31 usage("invalid -l option");

32 *ptr++ = 0; /* нуль заменяет последнюю точку. */

33 local port = ptr; /* имя сервиса или номер порта */

34 strncpy(localname, optarg, sizeof(localname));

35 lopt = 1;

36 break;

37 case 'v':

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);

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

Интервал:

Закладка:

Сделать

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

Представляем Вашему вниманию похожие книги на «UNIX: разработка сетевых приложений» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


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

Обсуждение, отзывы о книге «UNIX: разработка сетевых приложений» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x