-->

UNIX: разработка сетевых приложений

На нашем литературном портале можно бесплатно читать книгу UNIX: разработка сетевых приложений, Стивенс Уильям Ричард-- . Жанр: ОС и Сети. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
UNIX: разработка сетевых приложений
Название: UNIX: разработка сетевых приложений
Дата добавления: 16 январь 2020
Количество просмотров: 389
Читать онлайн

UNIX: разработка сетевых приложений читать книгу онлайн

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

Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

Перейти на страницу:

 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 timeoutn");

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 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
.

14.3. Функции recv и send

Эти две функции аналогичны стандартным функциям

read
и
write
, но для них требуется дополнительный аргумент.

#include <sys/socket.h>

ssize_t recv(int <i>sockfd</i>, void *<i>buff</i>, size_t <i>nbytes</i>, int <i>flags</i>);

ssize_t send(int <i>sockfd</i>, const void *<i>buff</i>, size_t <i>nbytes</i>, int <i>flags</i>);

<i>Обе функции возвращают: количество прочитанных или записанных байтов в случае успешного выполнения, -1 в случае ошибки</i>

Первые три аргумента функций

recv
и
send
совпадают с тремя первыми аргументами функций read и write. Аргумент
flags
либо имеет нулевое значение, либо формируется в результате применения операции логического ИЛИ к константам, представленным в табл. 14.1.

Таблица 14.1. Аргумент flags для функций ввода-вывода

flags Описание recv send
MSG_DONTROUTE He искать в таблице маршрутизации
MSG_DONTWAIT Только эта операция является неблокируемой
MSG_OOB Отправка или получение внеполосных данных
MSG_PEEK Просмотр приходящих сообщений
MSG_WAITALL Ожидание всех данных
Перейти на страницу:
Комментариев (0)
название