UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
//names/daytimetcpcli.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5 int sockfd, n; 6 char recvline[MAXLINE + 1]; 7 socklen_t len; 8 struct sockaddr_storage *ss; 9 if (argc != 3)10 err_quit11 ("usage, daytimetcpcli <hostname/IPaddress> <service/port#>");12 sockfd = Tcp_connect(argv[1], argv[2]);13 len = sizeof(ss);14 Getpeername(sockfd, (SA*)&ss, &len);15 printf("connected to %sn", Sock_ntop_host((SA*)&ss, len));16 while ((n = Read(sockfd, recvline, MAXLINE)) > 0) {17 recvline[n] = 0; /* завершающий нуль */18 Fputs(recvline, stdout);19 }20 exit(0);21 }9-1112tcp_connect13-15getpeernameОбратите внимание, что функция
tcp_connectconnectgetaddrinfoMAXSOCKADDRunp.hgetpeernameЭта версия нашего клиента работает и с IPv4, и с IPv6, тогда как версия, представленная в листинге 1.1, работала только с IPv4, а версия из листинга 1.2 — только с IPv6. Сравните нашу новую версию с представленной в листинге Д.6, которую мы написали, чтобы использовать функции
gethostbynamegetservbynameСначала мы задаем имя узла, поддерживающего только IPv4:
freebsd % <b>daytimetcpcli linux daytime</b>connected to 206 168.112.96Sun Jul 27 23:06:24 2003Затем мы задаем имя узла, поддерживающего и IPv4, и IPv6:
freebsd % <b>daytimetcpcli aix daytime</b>connected to 3ffe:b80:1f8d:2:204:acff:fe17:bf38Sun Jul 27 23:17:13 2003Используется адрес IPv6, поскольку у узла имеется и запись типа AAAA, и запись типа А. Кроме того, функция
tcp_connectAF_UNSPECВ следующем примере мы указываем на необходимость использования именно адреса IPv4, задавая имя узла с суффиксом
-4freebsd % <b>daytimetcpcli aix-4 daytime</b>connected to 192.168.42.2Sun Jul 27 23:17:48 200311.13. Функция tcp_listen
Наша следующая функция,
tcp_listen#include "unp.h"int tcp_listen(const char *<i>hostname</i>, const char *<i>service</i>, socklen_t *<i>lenptr</i>);<i>В случае успешного выполнения возвращает дескриптор присоединенного сокета, в случае ошибки не возвращает ничего</i>Листинг 11.6. Функция tcp_listen: выполнение обычных шагов сервера TCP
//lib/tcp_listen.c 1 #include "unp.h" 2 int 3 tcp_listen(const char *host, const char *serv, socklen_t *addrlenp) 4 { 5 int listenfd, n; 6 const int on = 1; 7 struct addrinfo hints, *res, *ressave; 8 bzero(&hints, sizeof(struct addrinfo)); 9 hints.ai_flags = AI_PASSIVE;10 hints.ai_family = AF_UNSPEC;11 hints.ai_socktype = SOCK_STREAM;12 if ((n = getaddrinfo(host, serv, &hints, &res)) != 0)13 err_quit("tcp_listen error for %s, %s: %s",14 host, serv, gai_strerror(n));
