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

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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать
Рис 288 Приложение создает свой сокет UDP и доменный сокет Unix Далее - фото 136

Рис. 28.8. Приложение создает свой сокет UDP и доменный сокет Unix

Далее приложение «передает» свой UDP-сокет демону через соединение домена Unix, используя технологию передачи дескрипторов, как показано в разделе 15.7. Такой подход позволяет демону получить копию сокета, так что он может вызвать функцию getsocknameи получить номер порта, связанный с сокетом. На рис. 28.9 показана передача сокета.

iphl ipsrc srcstr sizeofsrcstr 37 InetntopAFINET - фото 137ip_hl ip_src, srcstr, sizeof(srcstr)),

37 Inet_ntop(AF_INET, &hip->ip_dst, dststr, sizeof(dststr)),

38 hip->ip_p);

39 if (hip->ip_p == IPPROTO_UDP) {

40 udp = (struct udphdr*)(buf + hlen1 + 8 + hlen2);

41 sport = udp->uh_sport;

42 /* поиск доменного сокета клиента, отправка заголовка */

43 for (i = 0; i = 0 &&

45 client[i].family == AF_INET &&

46 client[i].lport == sport) {

47 bzero(&dest, sizeof(dest));

48 dest.sin_family = AF_INET;

49 #ifdef HAVE_SOCKADDR_SA_LEN

50 dest.sin_len = sizeof(dest);

51 #endif

52 memcpy(&dest.sin_addr, &hip->ip_dst,

53 sizeof(struct in_addr));

54 dest.sin_port = udp->uh_dport;

55 icmpd_err.icmpd_type = icmp->icmp_type;

56 icmpd_err.icmpd_code = icmp->icmp_code;

57 icmpd_err.icmpd_len = sizeof(struct sockaddr_in);

58 memcpy(&icmpd_err.icmpd_dest, &dest, sizeof(dest));

59 /* преобразование кода и типа ICMP в значение errno */

60 icmpd_err.icmpd_errno = EHOSTUNREACH; /* по умолчанию */

61 if (icmp->icmp_type == ICMP_UNREACH) {

62 if (icmp->icmp_code == ICMP_UNREACH_PORT)

63 icmpd_err.icmpd_errno = ECONNREFUSED;

64 else if (icmp->icmp_code == ICMP_UNREACH_NEEDFRAG)

65 icmpd_err.icmpd_errno = EMSGSIZE;

66 }

67 Write(client[i].connfd, &icmpd_err, sizeof(icmpd_err));

68 }

69 }

70 }

71 }

72 return(--nready);

73 }

Проверка типа сообщения, уведомление приложения

29-31 ICMP-сообщения, которые посылаются приложениям, — это сообщения о недоступности порта, превышении времени и завершении клиента (см. табл. 28.1).

Проверка ошибки UDP, поиск клиента

34-42 Указатель hipуказывает на IP-заголовок, который возвращается сразу после заголовка ICMP. Это IP-заголовок дейтаграммы, вызвавшей ICMP-ошибку. Мы убеждаемся, что эта IP-дейтаграмма является UDP-дейтаграммой, а затем извлекаем номер UDP-порта из UDP-заголовка, следующего за IP-заголовком.

43-55 По всем структурам clientосуществляется поиск подходящего семейства адресов и порта. Если соответствие найдено, строится структура адреса сокета IPv4, которая содержит IP-адрес получателя и порт из UDP-дейтаграммы, вызвавшей ошибку.

Построение структуры icmpd_err

56-70 Строится структура icmpd_err, посылаемая клиенту через доменный сокет Unix. Тип и код сообщения ICMP сначала отображаются в значение errno, как показано в табл. 28.1.

Ошибки ICMPv6 обрабатываются функцией readable_v6, первая часть которой приведена в листинге 28.31. Обработка ошибок ICMPv6 аналогична коду, приведенному в листингах 28.7 и 28.16.

Листинг 28.31. Обработка полученной дейтаграммы ICMPv6, первая часть

//icmpd/readable_v6.c

1 #include "icmpd.h"

2 #include

3 #include

4 #include

5 #include

6 #ifdef IPV6

7 #include

8 #include

9 #endif

10 int

11 readable_v6(void)

12 {

13 #ifdef IPV6

14 int i, hlen2, icmp6len, sport;

15 char buf[MAXLINE];

16 char srcstr[INET6_ADDRSTRLEN], dststr[INET6_ADDRSTRLEN];

17 ssize_t n;

18 socklen_t len;

19 struct ip6_hdr *ip6, *hip6;

20 struct icmp6_hdr *icmp6;

21 struct udphdr *udp;

22 struct sockaddr_in6 from, dest;

23 struct icmpd_err icmpd_err;

24 len = sizeof(from);

25 n = Recvfrom(fd6, buf, MAXLINE, 0, (SA*)&from, &len);

26 printf("%d bytes ICMPv6 from %s:", n, Sock_ntop_host((SA*)&from, len));

27 icmp6 = (struct icmp6_hdr*)buf; /* начало заголовка ICMPv6 */

28 if ((icmp6len = n)

29 err_quit("icmp6len (%d)

30 printf(" type = %d, code = %d\n", icmp6->icmp6_type, icmp6->icmp6_code);

Вторая часть функции readable_v6приведена в листинге 28.32. Код аналогичен приведенному в листинге 28.30: мы проверяем тип ICMP-ошибки, убеждаемся, что дейтаграмма, вызвавшая ошибку, является UDP-дейтаграммой, а затем строим структуру icmpd_err, которую отсылаем клиенту.

Листинг 28.32. Обработка полученной дейтаграммы ICMPv6, вторая часть

//icmpd/readable_v6.c

31 if (icmp6->icmp6_type == ICMP6_DST_UNREACH ||

32 icmp6->icmp6_type == ICMP6_PACKET_TOO_BIG ||

33 icmp6->icmp6_type == ICMP6_TIME_EXCEEDED) {

34 if (icmp6len

35 err_quit("icmp6len (%d)

36 hip6 = (struct ip6_hdr*)(buf + 8);

37 hlen2 = sizeof(struct ip6_hdr);

38 printf("\tsrcip = %s, dstip = %s, next hdr = %d\n",

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

Интервал:

Закладка:

Сделать

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

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


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

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

x