UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
12 if (cred.cmcred_ngroups == 0) {13 printf("(no credentials returned)n");14 } else {15 printf("PID of sender = %dn", cred.cmcred_pid);16 printf("real user ID = %dn", cred.cmcred_uid);17 printf("real group ID = %dn", cred.cmcred_gid);18 printf("effective user ID = %dn", cred.cmcred_euid);19 printf("%d groups:", cred.cmcred_ngroups - 1);20 for (i = 1; i < cred.cmcred_ngroups; i++)21 printf(" %d", cred.cmcred_groups[i]);22 printf("n");23 }24 Writen(sockfd, buf, n);25 }26 if (n < 0 && errno == EINTR)27 goto again;28 else if (n < 0)29 err_sys("str_echo: read error");30 }11-2324-25Наш клиент, представленный в листинге 15.4, остается практически неизменным. Мы добавляем передачу пустой структуры
cmsgcredsendmsgПеред запуском клиента определим свои личные данные командой
idfreebsd % <b>id</b>uid=1007(andy) gid=1007(andy) groups=1007(andy), 0(wheel)Если мы запустим сервер в одном окне, а клиент в другом, то для сервера после однократного выполнения клиента получим представленный ниже вывод.
freebsd % <b>unixstrserv02</b>PID of sender = 26881real user ID = 1007real group ID = 1007effective user ID = 10072 groups: 1007 0Информация выводится только после отправки клиентом данных серверу. Мы видим, что сведения соответствуют тем, которые были получены командой
id15.9. Резюме
Доменные сокеты Unix являются альтернативой IPC, когда клиент и сервер находятся на одном узле. Преимущество использования доменных сокетов Unix перед некоторой формой IPC состоит в том, что используемый API практически идентичен клиент-серверному сетевому соединению. Преимущество использования доменных сокетов Unix перед TCP, когда клиент и сервер находятся на одном узле, заключается в повышенной производительности доменных сокетов Unix относительно TCP во многих реализациях.
Мы изменили наш эхо-сервер и эхо-клиент TCP и UDP для использования доменных протоколов Unix, и единственным главным отличием оказалась необходимость при помощи функции
bindПередача дескрипторов между клиентами и серверами, находящимися на одном узле, — это мощная технология, которая используется при работе с доменными сокетами Unix. Мы показали пример передачи дескриптора от дочернего процесса обратно родительскому процессу в разделе 15.7. В разделе 28.7 мы покажем пример, в котором клиент и сервер не будут родственными, а в разделе 30.9 — другой пример, когда дескриптор передается от родительского процесса дочернему.
Упражнения
1. Что произойдет, если доменный сервер Unix вызовет функцию
unlinkbind2. Что произойдет, если доменный сервер Unix при завершении не отсоединит с помощью функции
unlinkconnect3. Измените листинг 11.5 так, чтобы после того как будет выведен адрес протокола собеседника, вызывалась бы функция
sleep(5)readwritereadЗапустите клиент и сервер на одном узле, используя доменный сокет Unix. Изменилось ли что-нибудь?
Теперь для сервера вместо функции write вызовите функцию
sendMSG_EOR4. Напишите программу, определяющую значения, показанные в табл. 4.6. Один из подходов — создать потоковый канал и затем с помощью функции
forkforbacklogbacklogbacklogalarmbacklogSYNacceptalarmconnectbacklog
