UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
4.6. Функция accept
Функция
accept#include <sys/socket.h>int accept(int <i>sockfd</i>, struct sockaddr *<i>cliaddr</i>, socklen_t *<i>addrlen</i>);<i>Возвращает: неотрицательный дескриптор в случае успешного выполнения функции, -1 в случае ошибки</i>Аргументы
cliaddraddrlenaddrlen*addrlencliaddrЕсли выполнение функции
acceptacceptsocketbindlistenacceptЭта функция возвращает до трех значений: целое число, которое является либо дескриптором сокета, либо кодом ошибки, а также адрес протокола клиентского процесса (через указатель
cliaddraddrlencliaddraddrlenВ листинге 1.5 показаны эти моменты. Присоединенный сокет закрывается при каждом прохождении цикла, но прослушиваемый сокет остается открытым в течение времени жизни сервера. Мы также видим, что второй и третий аргументы функции
acceptПример: аргументы типа «значение-результат»
В листинге 4.2 представлен измененный код из листинга 1.5 (вывод IP-адреса и номера порта клиента), обрабатывающий аргумент типа «значение-результат» функции accept.
Листинг 4.2. Сервер определения времени и даты, сообщающий IP-адрес и номер порта клиента
//intro/daytimetcpsrv1.c 1 #include "unp.h" 2 #include <time.h> 3 int 4 main(int argc, char **argv) 5 { 6 int listenfd, connfd; 7 socklen_t len; 8 struct sockaddr_in servaddr, cliaddr; 9 char buff[MAXLINE];10 time_t ticks;11 listenfd = Socket(AF_INET, SOCK_STREAM, 0);12 bzero(&servaddr, sizeof(servaddr));13 servaddr.sin_family = AF_INET;14 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);15 servaddr.sin_port = htons(13); /* сервер времени и даты */16 Bind(listenfd, (SA*)&servaddr, sizeof(servaddr));17 Listen(listenfd, LISTENQ);18 for (;;) {19 len = sizeof(cliaddr);20 connfd = Accept(listenfd, (SA*)&cliaddr, &len);21 printf("connection from %s, port %dn",22 Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff));23 ntohs(cliaddr.sin_port));24 ticks = time(NULL);25 snprintf(buff, sizeof(buff), "% 24srn", ctime(&ticks));26 Write(connfd, buff, strlen(buff));27 Close(connfd);28 }29 }7-8lencliaddr19-23lencliaddrlenacceptinet_ntopntohsПри вызове функции sock_ntop вместо inet_ntop наш сервер станет меньше зависеть от протокола, однако он все равно зависит от IPv4. Мы покажем версию этого сервера, не зависящего от протокола, в листинге 11.7.
