Тайм-аут для функции recvfrom (функция select)

Тайм-аут для функции recvfrom (функция select)

Мы демонстрируем вторую технологию для установки тайм-аута (использование функции select) в листинге 14.3. Здесь показана наша функция readable_timeo, которая ждет, когда дескриптор станет готов для чтения, но не более заданного числа секунд.

Листинг 14.3. Функция readable_timeo: ожидание, когда дескриптор станет готов для чтения

//lib/readable_timео.c

 1 #include "unp.h"

 2 int

 3 readable_timeo(int fd, int sec)

 4 {

 5  fd_set rset;

 6  struct timeval tv;

 7  FD_ZERO(&rset);

 8  FD_SET(fd, &rset);

 9  tv.tv_sec = sec;

10  tv.tv_usec = 0;

11  return (select(fd + 1, &rset, NULL, NULL, &tv));

12  /* > если дескриптор готов для чтения */

13 }

Подготовка аргументов для функции select

7-10 В наборе дескрипторов для чтения включается бит, соответствующий данному дескриптору. В структуре timeval устанавливается время (число секунд), в течение которого вызывающий процесс готов ждать.

Блокирование в функции select

11-12 Функция select ждет, когда дескриптор станет готов для чтения или истечет заданное время ожидания. Возвращаемое значение этой функции — это возвращаемое значение функции select: -1 в случае ошибки, 0, если истекло время ожидания, и положительное значение, задающее число готовых дескрипторов, если таковые появились.

Эта функция не выполняет операции чтения — она просто ждет, когда дескриптор будет готов к чтению. Следовательно, эту функцию можно использовать с любым типом сокета — TCP или UDP.

Создание аналогичной функции, называемой writable_timeo, тривиально. Эта функция ждет, когда дескриптор будет готов для записи.

Мы используем эту функцию в листинге 14.4, где показана еще одна версия нашей функции dg_cli, приведенной в листинге 8.4. Эта новая версия вызывает функцию recvfrom, только когда наша функция readable_timeo возвращает положительное значение.

Мы не вызываем функцию recvfrom, пока функция readable_timeo не сообщит нам, что дескриптор готов для чтения. Тем самым мы гарантируем, что функция recvfrom не заблокируется.

Листинг 14.4. Функция dg_cli, вызывающая функцию readable_timeo для установки тайм-аута

//advio/dgclitimeo1.c

 1 #include "unp.h"

 2 void

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

 4 {

 5  int n;

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

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

 8   Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);

 9   if (Readable_timeo(sockfd, 5) == 0) {

10    fprintf(stderr, "socket timeout ");

11   } else {

12    n = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);

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

14    Fputs(recvline, stdout);

15   }

16  }

17 }

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Пример: очереди сообщений Posix и функция select

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

Пример: очереди сообщений Posix и функция select Дескриптор очереди сообщений (переменная типа mqd_t) не является «обычным» дескриптором и не может использоваться с функциями select и poll (глава 6 [24]). Тем не менее их можно использовать вместе с каналом и функцией mq_notify. (Аналогичный


10.11.1 Тайм-аут

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

10.11.1 Тайм-аут Работа партнера по соединению может завершиться крахом либо полностью прерваться вследствие неисправности шлюза или связи. Чтобы предотвратить повторную пересылку данных в TCP, существует несколько механизмов.Достигнув первого порогового значения для


Тайм-ауты ядра и функция pthread_join()

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

Тайм-ауты ядра и функция pthread_join() Самый простой пример для рассмотрения — это использование тайм-аута с функцией pthread_join(). Вот как это можно было бы сделать:/* * tt1.c*/#include <stdio.h>#include <pthread.h>#include <inttypes.h>#include <errno.h>#include <sys/neutrino.h>#define SEC_NSEC 1000000000LL // В одной


3.8. Функция sock_ntop и связанные с ней функции

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

3.8. Функция sock_ntop и связанные с ней функции Основная проблема, связанная с функцией inet_ntop, состоит в том, что вызывающий процесс должен передать ей указатель на двоичный адрес. Этот адрес обычно содержится в структуре адреса сокета, поэтому вызывающему процессу необходимо


Глава 6 Мультиплексирование ввода-вывода: функции select и poll

Из книги автора

Глава 6 Мультиплексирование ввода-вывода: функции select и poll 6.1. Введение В разделе 5.12 мы видели, что наш TCP-клиент обрабатывает два входных потока одновременно: стандартный поток ввода и сокет TCP. Проблема, с которой мы столкнулись, состояла в том, что пока клиент был


Максимальное число дескрипторов для функции select

Из книги автора

Максимальное число дескрипторов для функции select Ранее мы сказали, что большинство приложений не используют много дескрипторов. Например, редко можно найти приложение, использующее сотни дескрипторов. Но такие приложения существуют, и часто они используют функцию select


8.2. Функции recvfrom и sendto

Из книги автора

8.2. Функции recvfrom и sendto Эти две функции аналогичны стандартным функциям read и write, но требуют трех дополнительных аргументов.#include <sys/socket.h>ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags, const struct sockaddr *to, socklen_t addrlen);Обе


Тайм-аут для функции connect (сигнал SIGALRM)

Из книги автора

Тайм-аут для функции connect (сигнал SIGALRM) В листинге 14.1[1] показана наша функция connect_timeo, вызывающая функцию connect с ограничением по времени, заданным вызывающим процессом. Первые три аргумента — это аргументы, которых требует функция connect, а четвертый — это длительность


Тайм-аут для функции recvfrom (сигнал SIGALRM)

Из книги автора

Тайм-аут для функции recvfrom (сигнал SIGALRM) В листинге 14.2 показана новая версия функции dg_cli, приведенной в листинге 8.4, в которую добавлен вызов функции alarm для прерывания функции recvfrom при отсутствии ответа в течение 5 с.Листинг 14.2. Функция dg_cli, в которой при установке тайм-аута


Тайм-аут для функции recvfrom (параметр сокета SO_RCVTIMEO)

Из книги автора

Тайм-аут для функции recvfrom (параметр сокета SO_RCVTIMEO) В нашем последнем примере демонстрируется применение параметра сокета SO_RCVTIMEO. Мы устанавливаем этот параметр один раз для дескриптора, задавая значение тайм-аута, и этот тайм-аут затем применяется ко всем операциям


21.7. Функция mcast_join и родственные функции

Из книги автора

21.7. Функция mcast_join и родственные функции Несмотря на то что параметры сокетов многоадресной передачи для IPv4 аналогичны параметрам сокетов многоадресной передачи для IPv6, есть достаточно много различий, из-за которых не зависящий от протокола код, использующий


Простой пример использования функции select

Из книги автора

Простой пример использования функции select Теперь мы переделаем код нашего получателя внеполосных данных и вместо сигнала SIGURG будем использовать функцию select. В листинге 24.3 показана принимающая программа.Листинг 24.3. Принимающая программа, в которой (ошибочно)


Коллизии при вызове функции select

Из книги автора

Коллизии при вызове функции select Рассматривая данный пример в 4.4BSD, мы можем исследовать еще одну проблему, которая встречается довольно редко и поэтому часто остается непонятой до конца. В разделе 16.13 [128] говорится о коллизиях (collisions), возникающих при вызове функции select