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_RCVTIMEOSO_SNDTIMEOconnectЛистинг 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 } else19 err_sys("recvfrom error");20 }21 recvline[n] = 0; /* завершающий нуль */22 Fputs(recvline, stdout);23 }24 }8-10setsockopttimeval15-17recvfromEWOULDBLOCK14.3. Функции recv и send
Эти две функции аналогичны стандартным функциям
readwrite#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>Первые три аргумента функций
recvsendflagsТаблица 14.1. Аргумент flags для функций ввода-вывода
| flags | Описание | recv | send |
|---|---|---|---|
| MSG_DONTROUTE | He искать в таблице маршрутизации | • | |
| MSG_DONTWAIT | Только эта операция является неблокируемой | • | • |
| MSG_OOB | Отправка или получение внеполосных данных | • | |
| MSG_PEEK | Просмотр приходящих сообщений | • | |
| MSG_WAITALL | Ожидание всех данных | • |
