UNIX: разработка сетевых приложений
Шрифт:
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\n");
11 } else {
12 n = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);
13 recvline[n] = 0; /* завершающий нуль */
14 Fputs(recvline, stdout);
15 }
16 }
17 }
Тайм-аут
В нашем последнем примере демонстрируется применение параметра сокета
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\n");
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
. 14.3. Функции recv и send
Эти две функции аналогичны стандартным функциям
read
и write
, но для них требуется дополнительный аргумент.
#include <sys/socket.h>
ssize_t recv(int sockfd, void * buff, size_t nbytes, int flags);
ssize_t send(int sockfd, const void * buff, size_t nbytes, int flags);
Обе функции возвращают: количество прочитанных или записанных байтов в случае успешного выполнения, -1 в случае ошибки
Первые три аргумента функций
recv
и send
совпадают с тремя первыми аргументами функций read и write. Аргумент flags
либо имеет нулевое значение, либо формируется в результате применения операции логического ИЛИ к константам, представленным в табл. 14.1. Таблица 14.1. Аргумент flags для функций ввода-вывода
flags | Описание | recv | send |
---|---|---|---|
MSG_DONTROUTE | He искать в таблице маршрутизации | • | |
MSG_DONTWAIT | Только эта операция является неблокируемой | • | • |
MSG_OOB | Отправка или получение внеполосных данных | • | |
MSG_PEEK | Просмотр приходящих сообщений | • | |
MSG_WAITALL | Ожидание всех данных | • |
MSG_DONTROUTE
. Этот флаг сообщает ядру, что получатель находится в нашей сети, и поэтому не нужно выполнять поиск в таблице маршрутизации. Дополнительную информацию об этом свойстве мы приводим при описании параметра сокета SO_DONTROUTE
(см. раздел 7.5). Это свойство можно включить для одной операции вывода с флагом MSG_DONTROUTE
или для всех операций вывода данного сокета, используя указанный параметр сокета.
MSG_DONTWAIT
. Этот флаг указывает, что отдельная операция ввода-вывода является неблокируемой. Таким образом, отпадает необходимость включать флаг отсутствия блокировки для сокета, выполнять операцию ввода-вывода и затем выключать флаг отсутствия блокировки. Неблокируемый ввод-вывод мы опишем в главе 15 вместе с включением и выключением флага отсутствия блокировки для всех операций ввода-вывода через сокет.
Поделиться:
Популярные книги
Штурм Земли
8. Пробуждение Системы
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Чехов. Книга 3
3. Адвокат Чехов
Фантастика:
альтернативная история
5.00
рейтинг книги
Кодекс Охотника. Книга XXI
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний попаданец 11. Финал. Часть 1
11. Последний попаданец
Фантастика:
фэнтези
юмористическое фэнтези
рпг
5.00
рейтинг книги
Право налево
Любовные романы:
современные любовные романы
8.38
рейтинг книги
Комбинация
2. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прометей: Неандерталец
4. Прометей
Фантастика:
героическая фантастика
альтернативная история
7.88
рейтинг книги
Идеальный мир для Лекаря 16
16. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Двойня для босса. Стерильные чувства
Любовные романы:
современные любовные романы
6.90
рейтинг книги
Деспот
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
На границе империй. Том 7. Часть 2
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
Возвышение Меркурия. Книга 13
13. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Ну привет, заучка...
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Титан империи 6
6. Титан Империи
Фантастика:
боевая фантастика
попаданцы
аниме
5.00