Чтение онлайн

на главную

Жанры

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 }

Тайм-аут

для функции 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\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

Гоблин (MeXXanik)
3. Адвокат Чехов
Фантастика:
альтернативная история
5.00
рейтинг книги
Чехов. Книга 3

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Последний попаданец 11. Финал. Часть 1

Зубов Константин
11. Последний попаданец
Фантастика:
фэнтези
юмористическое фэнтези
рпг
5.00
рейтинг книги
Последний попаданец 11. Финал. Часть 1

Право налево

Зика Натаэль
Любовные романы:
современные любовные романы
8.38
рейтинг книги
Право налево

Комбинация

Ланцов Михаил Алексеевич
2. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Комбинация

Прометей: Неандерталец

Рави Ивар
4. Прометей
Фантастика:
героическая фантастика
альтернативная история
7.88
рейтинг книги
Прометей: Неандерталец

Идеальный мир для Лекаря 16

Сапфир Олег
16. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 16

Двойня для босса. Стерильные чувства

Лесневская Вероника
Любовные романы:
современные любовные романы
6.90
рейтинг книги
Двойня для босса. Стерильные чувства

Деспот

Шагаева Наталья
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Деспот

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Возвышение Меркурия. Книга 13

Кронос Александр
13. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 13

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

Титан империи 6

Артемов Александр Александрович
6. Титан Империи
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Титан империи 6