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

Интервал:

Закладка:

Сделать
Чтение сообщения

16-18 Первое сообщение считывается из сокета вызовом sctp_recvmsg.

Обработка ошибки чтения

19-22 Если sctp_recvmsgвозвращает ошибку или признак конца файла EOF, соответствующий код возвращается вызвавшему нашу функцию процессу без всяких изменений.

Если сообщение считано не полностью

23-24 Если флаги сообщения показывают, что оно было считано не полностью, мы вызываем функцию sctp_recvmsgснова. Предварительно мы вычисляем объем свободного места в буфере.

Проверка необходимости увеличения статического буфера

25-34 Если остаток приемного буфера оказался меньше некоторого минимального значения, этот буфер необходимо увеличить. С этой целью мы вызываем функцию realloc, выделяющую буфер большего размера, после чего копируем в новый буфер данные из старого буфера. Если по какой-то причине размер буфера не может быть увеличен, функция завершает свою работу с выводом сообщения об ошибке.

Получение данных

35-36 Новые данные считываются из буфера вызовом sctp_recvmsg.

Шаг вперед

37-38 Функция увеличивает индекс буфера, после чего возвращается на проверку полного считывания сообщения.

После завершения цикла

39-40 После завершения цикла функция копирует количество считанных байтов в буфер, указатель на который передается ей вызвавшим процессом, и возвращает этому процессу указатель на собственный буфер.

Теперь мы можем изменить сервер SCTP таким образом, чтобы он использовал нашу новую функцию. Новый код представлен в листинге 23.3.

Листинг 23.3. Сервер SCTP, использующий API частичной доставки

//sctp/sctpserv05.c

26 for (;;) {

27 len = sizeof(struct sockaddr_in);

28 bzero(&sri,.sizeof(sri));

29 readbuf = pdapi_recvmsg(sock_fd, &rd_sz,

30 (SA*)&cliaddr, &len, &sri, &msg_flags);

31 if (readbuf == NULL)

32 continue;

Чтение сообщения

29-30 Сервер вызывает новую функцию-обертку интерфейса частичной доставки. Предварительно обнуляется переменная sri.

Проверка наличия считанных данных

31-32 Обратите внимание, что теперь серверу приходится проверять объем буфера, чтобы убедиться, что чтение было успешным. Если буфер оказывается нулевым, программа переходит на начало цикла.

23.4. Уведомления

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

Листинг 23.4. Функция вывода уведомлений

1 #include "unp.h"

2 void

3 print_notification(char *notify_buf)

4 {

5 union sctp_notification *snp;

6 struct sctp_assoc_change *sac;

7 struct sctp_paddr_change *spc;

8 struct sctp_remote_error *sre;

9 struct sctp_send_failed *ssf;

10 struct sctp_shutdown_event *sse;

11 struct sctp_adaption_event *ae;

12 struct sctp_pdapi_event *pdapi,

13 const char *str;

14 snp = (union sctp_notification*)notify_buf;

15 switch (snp->sn_header.sn_type) {

16 case SCTP_ASSOC_CHANGE:

17 sac = &snp->sn_assoc_change;

18 switch (sac->sac_state) {

19 case SCTP_COMM_UP:

20 str = "COMMUNICATION UP";

21 break;

22 case SCTP_COMM_LOST:

23 str = "COMMUNICATION LOST";

24 break;

25 case SCTP_RESTART:

26 str = "RESTART";

27 break;

28 case SCTP_SHUTDOWN_COMP:

29 str = "SHUTDOWN COMPLETE";

30 break;

31 case SCTP_CANT_STR_ASSOC:

32 str = "CAN'T START ASSOC";

33 break;

34 default:

35 str = "UNKNOWN";

36 break;

37 } /* конец ветвления switch (sac->sac_state) */

38 printf("SCTP_ASSOC_CHANGE %s, assoc=0x%x\n", str,

39 (uint32_t)sac->sac_assoc_id);

40 break;

41 case SCTP_PEER_ADDR_CHANGE:

42 spc = &snp->sn_paddr_change;

43 switch (spc->spc_state) {

44 case SCTP_ADDR_AVAILABLE:

45 str = "ADDRESS AVAILABLE";

46 break;

47 case SCTP_ADDR_UNREACHABLE:

48 str = "ADDRESS UNREACHABLE";

49 break;

50 case SCTP_ADDR_REMOVED:

51 str = "ADDRESS REMOVED";

52 break;

53 case SCTP_ADDR_ADDED:

54 str = "ADDRESS ADDED";

55 break;

56 case SCTP_ADDR_MADE_PRIM:

57 str = "ADDRESS MADE PRIMARY";

58 break;

59 default:

60 str = "UNKNOWN";

61 break;

62 } /* конец ветвления switch (spc->spc_state) */

63 printf("SCTP_PEER_ADDR_CHANGE %s, addr=%s, assoc=0x%x\n", str,

64 Sock_ntop((SA*)&spc->spc_aaddr, sizeof(spc->spc_aaddr)),

65 (uint32_t)spc->spc_assoc_id);

66 break;

67 case SCTP_REMOTE_ERROR:

68 sre = &snp->sn_remote_error;

69 printf("SCTP_REMOTE_ERROR: assoc=0x%x error=%d\n",

70 (uint32_t)sre->sre_assoc_id, sre->sre_error);

71 break;

72 case SCTP_SEND_FAILED:

73 ssf = &snp->sn_send_failed;

74 printf("SCTP_SEND_FAILED: assoc=0x%x error=%d\n",

75 (uint32_t)ssf->ssf_assoc_id, ssf->ssf_error);

76 break;

77 case SCTP_ADAPTION_INDICATION:

78 ae = &snp->sn_adaption_event;

79 printf("SCTP_ADAPTION_INDICATION: 0x%x\n",

80 (u_int)ae->sai_adaption_ind);

81 break;

82 case SCTP_PARTIAL_DELIVERY_EVENT:

83 pdapi = &snp->sn_pdapi_event;

84 if (pdapi->pdapi_indication == SCTP_PARTIAL_DELIVERY_ABORTED)

85 printf("SCTP_PARTIAL_DELIEVERY_ABORTED\n");

86 else

87 printf("Unknown SCTP_PARTIAL_DELIVERY_EVENT 0x%x\n",

88 pdapi->pdapi_indication);

89 break;

90 case SCTP_SHUTDOWN_EVENT:

91 sse = &snp->sn_shutdown_event;

92 printf("SCTP_SHUTDOWN_EVENT: assoc=0x%x\n",

93 (uint32_t)sse->sse_assoc_id);

94 break;

95 default:

96 printf("Unknown notification event type=0x%x\n",

97 snp->sn_header.sn_type);

98 }

99 }

Преобразование буфера и начало ветвления

14-15 Функция преобразует буфер вызова к типу union, после чего разыменовывает структуру sn_headerи тип sn_typeи выполняет ветвление по значению соответствующего поля.

Обработка изменения состояния ассоциации

16-40 Если функция обнаруживает в буфере уведомление об изменении ассоциации, она выводит тип происшедшего изменения.

Изменение адреса собеседника

16-40 Если получено уведомление об изменении адреса собеседника, функция распечатывает событие и новый адрес.

Ошибка на удаленном узле

67-71 Если получено уведомление об ошибке на удаленном узле, функция отображает сообщение об этом вместе с идентификатором ассоциации, для которой получено уведомление. Мы не пытаемся декодировать и отобразить сообщение об ошибке, присланное собеседником. При необходимости эти сведения можно получить из поля sre_dataструктуры sctp_remote_error.

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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