Книга: UNIX: разработка сетевых приложений
Тайм-аут для функции 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 timeoutn");
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
.
- Тайм-аут для функции recvfrom (сигнал SIGALRM)
- 14.2. Тайм-ауты сокета
- Основные параметры ЭЛТ-мониторов
- Аргументы функции в Python
- 3. Функции
- Новые функции API для работы с Blob и массивами
- Безопасность внешних таблиц. Параметр EXTERNAL FILE DIRECTORY
- Единое имя файла параметров InterBase
- Глава 28 Идентификация и аутентификация пользователей
- Параметры конфигурационного файла InterBase
- Параметры в ibconfig
- Показания к изменению параметра