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
flags
Таблица 14.1. Аргумент flags для функций ввода-вывода
flags | Описание | recv | send |
---|---|---|---|
MSG_DONTROUTE | He искать в таблице маршрутизации | • | |
MSG_DONTWAIT | Только эта операция является неблокируемой | • | • |
MSG_OOB | Отправка или получение внеполосных данных | • | |
MSG_PEEK | Просмотр приходящих сообщений | • | |
MSG_WAITALL | Ожидание всех данных | • |