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

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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

Пример

Свяжем теперь всю эту информацию воедино в примере. Мы начнем с функции mainнашего клиента UDP, представленного в листинге 8.3, и изменим в ней только номер порта с SERV_PORTна 7 (стандартный эхо-сервер, см. табл. 2.1).

В листинге 22.4 показана функция dg_cli. Единственное изменение по сравнению с листингом 8.4 состоит в замене вызовов функций sendtoи recvfromвызовом нашей новой функции dg_send_recv.

Перед тем как представить функцию dg_send_recvи наши функции RTT, которые она вызывает, мы показываем в листинге 22.5 нашу схему реализации функциональных свойств, повышающих надежность клиента UDP. Все функции, имена которых начинаются с rtt_, описаны далее.

Листинг 22.4. Функция dg_cli, вызывающая нашу функцию dg_send_recv

//rtt/dg_cli.c

1 #include "unp.h"

2 ssize_t Dg_send_recv(int, const void*, size_t, void*, size_t,

3 const SA*, socklen_t);

4 void

5 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)

6 {

7 ssize_t n;

8 char sendline[MAXLINE], recvline[MAXLINE + 1];

9 while (Fgets(sendline, MAXLINE, fp) != NULL) {

10 n = Dg_send_recv(sockfd, sendline, strlen(sendline),

11 recvline, MAXLINE, pservaddr, servlen);

12 recvline[n] = 0; /* завершающий нуль */

13 Fputs(recvline, stdout);

14 }

15 }

Листинг 22.5. Схема функций RTT и последовательность их вызова

static sigjmp_buf jmpbuf;

{

формирование запроса

signal(SIGALRM, sig_alrm); /* устанавливаем обработчик сигнала */

rtt_newpack(); /* инициализируем значение счетчика rexmt нулем */

sendagain:

sendto();

alarm(rtt_start()); /* задаем аргумент функции alarm равным RTO */

if (sigsetjmp(jmpbuf, 1) != 0) {

if (rtt_timeout()) /* удваиваем RTO, обновляем оценочные значения */

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

goto sendagain; /* повторная передача */

}

do {

recvfrom();

} while (неправильный порядковый номер);

alarm(0); /* отключаем сигнал alarm */

rtt_stop(); /* вычисляем RTT и обновляем оценочные значения */

обрабатываем ответ

}

void sig_alrm(int signo) {

siglongjmp(jmpbuf, 1);

}

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

Мы вызываем функции sigsetjmpи siglongjmp, чтобы предотвратить возникновение ситуации гонок с сигналом SIGALRM, который мы описали в разделе 20.5. В листинге 22.6 показана первая часть нашей функции dg_send_recv.

Листинг 22.6. Функция dg_send_recv: первая половина

//rtt/dg_send_recv.c

1 #include "unprtt.h"

2 #include

3 #define RTT_DEBUG

4 static struct rtt_info rttinfo;

5 static int rttinit = 0;

6 static struct msghdr msgsend, msgrecv;

/* предполагается, что обе структуры инициализированы нулем */

7 static struct hdr {

8 uint32_t seq; /* порядковый номер */

9 uint32_t ts; /* отметка времени при отправке */

10 } sendhdr, recvhdr;

11 static void signalrm(int signo);

12 static sigjmp_buf jmpbuf;

13 ssize_t

14 dg_send_recv(int fd, const void *outbuff, size_t outbytes,

15 void *inbuff, size_t inbytes,

16 const SA *destaddr, socklen_t destlen)

17 {

18 ssize_t n;

19 struct iovec iovsend[2], iovrecv[2];

20 if (rttinit == 0) {

21 rtt_init(&rttinfo); /* первый вызов */

22 rttinit = 1;

23 rtt_d_flag = 1;

24 }

25 sendhdr.seq++;

26 msgsend.msg_name = destaddr;

27 msgsend.msg_namelen = destlen;

28 msgsend.msg_iov = iovsend;

29 msgsend.msg_iovlen = 2;

30 iovsend[0].iov_base = &sendhdr;

31 iovsend[0].iov_len = sizeof(struct hdr);

32 iovsend[1].iov_base = outbuff;

33 iovsend[1].iov_len = outbytes;

34 msgrecv.msg_name = NULL;

35 msgrecv.msg_namelen = 0;

36 msgrecv.msg_iov = iovrecv;

37 msgrecv.msg_iovlen = 2;

38 iovrecv[0].iov_base = &recvhdr;

39 iovrecv[0].iov_len = sizeof(struct hdr);

40 iovrecv[l].iov_base = inbuff;

41 iovrecv[l].iov_len = inbytes;

1-5 Мы включаем новый заголовочный файл unprtt.h, показанный в листинге 22.8, который определяет структуру rtt_info, содержащую информацию RTT для клиента. Мы определяем одну из этих структур и ряд других переменных.

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

Интервал:

Закладка:

Сделать

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

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


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

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

x