UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Если поддерживается более старый элемент
msg_accrightsrecvfdВ листинге 15.10 показана программа
openfileopenЛистинг 15.10. Программа openfile: открытие файла и передача дескриптора обратно
//unixdomain/openfile.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5 int fd; 6 ssize_t n; 7 if (argc != 4) 8 err_quit("openfile <sockfd#> <filename> <mode>"); 9 if ((fd = open(argv[2], atoi(argv[3]))) < 0)10 exit((errno > 0) ? errno : 255);11 if ((n = write_fd(atoi(argv[1]), "", 1, fd)) < 0)12 exit((errno > 0) ? errno : 255);13 exit(0);14 }6-7my_openatoi9-10openerrnoopen11-12write_fdexitСтатус выхода должен лежать в пределах от 0 до 255. Максимальное значение переменной errno — около 150. Альтернативный способ, при котором не требуется, чтобы значение переменной errno было меньше 256, заключается в том, чтобы передать обратно указание на ошибку в виде обычных данных при вызове функции sendmsg.
В листинге 15.11 показана последняя функция,
write_fdsendmsgЛистинг 15.11. Функция write_fd: передача дескриптора при помощи вызова функции sendmsg
//lib/write_fd.c 1 #include "unp.h" 2 ssize_t 3 write_fd(int fd, void *ptr, size_t nbytes, int sendfd) 4 { 5 struct msghdr msg; 6 struct iovec iov[1]; 7 #ifdef HAVE_MSGHDR_MSG_CONTROL 8 union { 9 struct cmsghdr cm;10 char control[CMSG_SPACE(sizeof(int))];11 } control_un;12 struct cmsghdr *cmptr;13 msg.msg_control = control_un.control;14 msg.msg_controllen = sizeof(control_un.control);15 cmptr = CMSG_FIRSTHDR(&msg);16 cmptr->cmsg_len = CMSG_LEN(sizeof(int));17 cmptr->cmsg_level = SOL_SOCKET;18 cmptr->cmsg_type = SCM_RIGHTS;19 *((int*)CMSG_DATA(cmptr)) = sendfd;20 #else21 msg.msg_accrights = (caddr_t)&sendfd;22 msg.msg_accrightslen = sizeof(int);23 #endif24 msg.msg_name = NULL;25 msg.msg_namelen = 0;26 iov[0].iov_base = ptr;27 iov[0].iov_len = nbytes;28 msg.msg_iov = iov;29 msg.msg_iovlen = 1;30 return (sendmsg(fd, &msg, 0));31 }Как и в случае функции
read_fgmsghdrsendmsgВ разделе 28.7 мы приводим пример передачи дескриптора, в котором участвуют неродственные (unrelated) процессы, а в разделе 30.9 — пример, где задействованы родственные процессы. В них мы будем использовать функции
read_fdwrite_fd15.8. Получение информации об отправителе
На рис. 14.4 мы показали другой тип информации, передаваемой через доменный сокет Unix в виде вспомогательных данных: информацию об отправителе, которая передается с помощью структуры
cmsgcred<sys/socket.h>
