UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
struct fcred { uid_t fc_ruid; /* действующий идентификатор пользователя */ gid_t fc_rgid; /* действующий групповой идентификатор */ char fc_login[MAXLOGNAME]; /* имя setlogin() */ uid_t fc_uid; /* идентификатор пользователя */ short fc_ngroups; /* количество групп */ gid_t fc_groups[NGROUPS]; /* дополнительные групповые идентификаторы */};#define fc_gid fc_groups[0] /* групповой идентификатор */Обычно
MAXLONGNAMENGROUPSfc_ngroupsЭта информация всегда доступна через доменный сокет Unix, хотя отправителю часто приходится принимать дополнительные меры для обеспечения ее отправки вместе с данными, и получателю также приходится выполнять некоторые действия (например, устанавливать параметры сокета). В системе FreeBSD получатель может обойтись вызовом
recvmsgcmsgcredsendmsgПример
В качестве примера передачи идентифицирующих данных мы изменим наш потоковый доменный сервер Unix, так чтобы он запрашивал идентифицирующие данные клиента. В листинге 15.12 показана новая функция,
read_credreadfcredЛистинг 15.12. Функция read_cred: чтение и возвращение идентифицирующих данных отправителя
//unixdomain/readcred.c 1 #include "unp.h" 2 #define CONTROL_LEN (sizeof(struct cmsghdr) + sizeof(struct cmsgcred)) 3 ssize_t 4 read_cred(int fd, void *ptr, size_t nbytes, struct cmsgcred *cmsgcredptr) 5 { 6 struct msghdr msg; 7 struct iovec iov[1]; 8 char control[CONTROL_LEN]; 9 int n;10 msg.msg_name = NULL;11 msg.msg_namelen = 0;12 iov[0].iov_base = ptr;13 iov[0].iov_len = nbytes;14 msg.msg_iov = iov;15 msg.msg_iovlen = 1;16 msg.msg_control = control;17 msg.msg_controllen = sizeof(control);18 msg.msg_flags = 0;19 if ((n = recvmsg(fd, &msg, 0)) < 0)20 return(n);21 cmsgcredptr->cmcred_ngroups = 0; /* идентифицирующие данные не получены */22 if (cmsgcredptr && msg.msg_controllen > 0) {23 struct cmsghdr *cmptr = (struct cmsghdr*)control;24 if (cmptr->cmsg_len < CONTROL_LEN)25 err_quit("control length = %d", cmptr->cmsg_len);26 if (cmptr->cmsg_level != SOL_SOCKET)27 err_quit("control level != SOL_SOCKET");28 if (cmptr->cmsg_type != SCM_CREDS)29 err_quit("control type != SCM_CREDS");30 memcpy(cmsgcredptr, CMSG_DATA(cmptr), sizeof(struct cmsgcred));31 }32 return(n);33 }3-4readcmsgcred22-31cmcred_ngroupsФункция
mainstr_echoforkЛистинг 15.13. Функция str_echo, запрашивающая идентифицирующие данные клиента
//unixdomain/strecho.c 1 #include "unp.h" 2 ssize_t read_cred(int, void*, size_t, struct cmsgcred*); 3 void 4 str_echo(int sockfd) 5 { 6 ssize_t n; 7 int i; 8 char buf[MAXLINE]; 9 struct cmsgcred cred;10 again:11 while ((n = read_cred(sockfd, buf, MAXLINE, &cred)) > 0) {
