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

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

В нашем последнем примере демонстрируется применение параметра сокета SO_RCVTIMEO. Мы устанавливаем этот параметр один раз для дескриптора, задавая значение тайм-аута, и этот тайм-аут затем применяется ко всем операциям чтения этого дескриптора. Одна из замечательных особенностей этого метода состоит в том, что мы устанавливаем данный параметр только один раз, тогда как предыдущие два метода требовали выполнения некоторых действий перед каждой операцией, для которой мы хотели задать временной предел. Но этот параметр сокета применяется только к операциям чтения. Аналогичный параметр SO_SNDTIMEO применяется только к операциям записи, и ни один параметр сокета не может использоваться для установки тайм-аута для функции connect.

Листинг 14.5. Функция dg_cli, использующая параметр сокета SO_RCVTIMEO для установки тайм-аута

//advio/dgclitimeo2.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  struct timeval tv;

 8  tv.tv_sec = 5;

 9  tv.tv_usec = 0;

10  Setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));

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

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

13    n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);

14    if (n < 0) {

15     if (errno == EWOULDBLOCK) {

16     fprintf(stderr, "socket timeout ");

17     continue;

18    } else

19     err_sys("recvfrom error");

20   }

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

22   Fputs(recvline, stdout);

23  }

24 }

Установка параметра сокета

8-10 Четвертый аргумент функции setsockopt — это указатель на структуру timeval, в которую записывается желательное значение тайм-аута.

Проверка тайм-аута

15-17 Если тайм-аут операции ввода-вывода истекает, функция (в данном случае recvfrom) возвращает ошибку EWOULDBLOCK.

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

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

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

Параметры сокета SO_RCVTIMEO и SO_SNDTIMEO

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

Параметры сокета SO_RCVTIMEO и SO_SNDTIMEO Эти два параметра сокета позволяют нам устанавливать тайм-аут при получении и отправке через сокет. Обратите внимание, что аргумент двух функций sockopt — это указатель на структуру timeval, ту же, которую использует функция select (раздел 6.3). Это


Параметр сокета IP_TTL

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

Параметр сокета IP_TTL С помощью этого параметра мы можем устанавливать и получать заданное по умолчанию значение TTL (time-to-live field — поле времени жизни, рис. А.1), которое система будет использовать для данного сокета. (TTL для многоадресной передачи устанавливается при помощи


7.7. Параметр сокета ICMPv6

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

7.7. Параметр сокета ICMPv6 Единственный параметр сокета, обрабатываемый ICMPv6, имеет аргумент level, равный


Параметр сокета ICMP6_FILTER

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

Параметр сокета ICMP6_FILTER Этот параметр позволяет нам получать и устанавливать структуру icmp6_filter, которая определяет, какие из 256 возможных типов сообщений ICMPv6 передаются для обработки на символьный сокет. Мы обсудим этот параметр в разделе


Параметр сокета IPV6_CHECKSUM

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

Параметр сокета IPV6_CHECKSUM Этот параметр сокета задает байтовое смещение поля контрольной суммы внутри данных пользователя. Если значение неотрицательное, ядро, во-первых, вычисляет и хранит контрольную сумму для всех исходящих пакетов и, во-вторых, проверяет полученную


Параметр сокета IPV6_DONTFRAG

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

Параметр сокета IPV6_DONTFRAG Установка этого параметра запрещает автоматическое включение заголовка фрагментации для UDP и символьных сокетов. При этом исходящие пакеты, размер которых превышает MTU исходящего интерфейса, просто сбрасываются. Системный вызов ошибку не


Параметр сокета IPV6_NEXTHOP

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

Параметр сокета IPV6_NEXTHOP Этот параметр задает адрес следующего транзитного узла для дейтаграммы в виде структуры адреса сокета. Подробнее о нем рассказывается в разделе


Параметр сокета IPV6_PATHMTU

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

Параметр сокета IPV6_PATHMTU Этот параметр может быть только получен, но не установлен. При его считывании система возвращает текущее значение маршрутной MTU, определенное соответствующим методом (см. раздел


Параметр сокета IPV6_RECVDSTOPTS

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

Параметр сокета IPV6_RECVDSTOPTS Установка этого параметра означает, что любые полученные IPv6-параметры получателя должны быть возвращены в качестве вспомогательных данных функцией recvmsg. По умолчанию параметр отключен. Мы опишем функции, используемые для создания и обработки


Параметр сокета IPV6_RECVHOPLIMIT

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

Параметр сокета IPV6_RECVHOPLIMIT Установка этого параметра определяет, что полученное поле предельного количества транзитных узлов (hop limit field) должно быть возвращено в качестве вспомогательных данных функцией recvmsg. По умолчанию параметр отключен. Мы опишем функции,


Параметр сокета IPV6_RECVHOPOPTS

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

Параметр сокета IPV6_RECVHOPOPTS Установка этого параметра означает, что любые полученные параметры транзитных узлов (hop-by-hop options) IPv6 должны быть возвращены в качестве вспомогательных данных функцией recvmsg. По умолчанию параметр отключен. Мы опишем функции, используемые для


Параметр сокета IPV6_RECVPATHMTU

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

Параметр сокета IPV6_RECVPATHMTU Установка этого параметра означает, что маршрутная MTU должна быть возвращена в качестве вспомогательных данных функцией recvmsg, при условии, что ее значение изменилось. Параметр будет описан в разделе


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);Обе


14.2. Тайм-ауты сокета

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

14.2. Тайм-ауты сокета Существует три способа установки тайм-аута для операции ввода-вывода через сокет.1. Вызов функции alarm, которая генерирует сигнал SIGALRM, когда истекает заданное время. Это подразумевает обработку сигналов, которая может варьироваться от одной


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

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

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


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

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

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