Семейство протоколов UNIX-домена
#include <sys/socket.h>#include <sys/un.h>socket( AF_LOCAL,SOCK_STREAM,0 );socket( AF_LOCAL,SOCK_DGRAM,0 );
Семейство протоколов UNIX-домена обеспечивает локальное (внутримашинную или «Нейтрино»-сеть) межпроцессное взаимодействие через обычные механизмы socket(). Семейство UNIX-домена поддерживает типы сокетов SOCK_STREAM и SOCK_DGRAM и использует для адресации пути файловой системы.
Обращение
Адреса домена UNIX - это пути файловой системы переменной длины, содержащие не более 104 символов. Заголовочный файл <sys/un.h> определяет этот адрес как:
struct sockaddr_un {u_char sun_len;u_char sun_family;char sun_path[104];};
Привязка имени к сокету UNIX-домена с помощью bind() приводит к созданию файла сокета в файловой системе. Этот файл не удаляется при закрытии сокета; необходимо использовать unlink() для удаления файла.
Возможно использование макроса SUN_LEN() (определенного в <sys/un.h>) для вычисления длины адреса UNIX-домена, требуемого для bind() и connect(). Поле sun_path должно заканчиваться символом NUL для использования с SUN_LEN(), однако завершающий NUL не является частью адреса.
Семейство протоколов UNIX-домена не поддерживает широковещательную адресацию или любую форму обработки «специальных символов» во входящих сообщениях. Все адреса являются абсолютными или относительными путями к другим сокетам домена UNIX. Штатные механизмы контроля доступа файловой системы также применяются при обращении к путям (например, место назначения connect() или sendto() должно быть доступно для записи).
Протоколы
Семейство протоколов UNIX-домена состоит из простых транспортных протоколов, которые поддерживают абстракции SOCK_STREAM и SOCK_DGRAM. Сокеты домена UNIX также поддерживают обмен файловыми дескрипторами за счет использования поля msg_control в аргументе msg для sendmsg() и recvmsg().
Любой действительный дескриптор может быть отправлен в сообщении. Передаваемый дескриптор файла описывается с помощью структуры cmsghdr, определенной в заголовочном файле <sys/socket.h>. Тип сообщения - SCM_RIGHTS, а часть сообщения с данными представляет собой массив целых чисел, представляющих передаваемые файловые дескрипторы. Количество передаваемых дескрипторов определяется полем длины сообщения; поле длины представляет собой сумму размера заголовка плюс размер массива файловых дескрипторов.
Полученный дескриптор является копией дескриптора отправителя, как если бы он был создан с помощью вызова dup(). Дескрипторы, ожидающие сообщения или намеренно не получившие сообщение, автоматически закрываются системой при закрытии целевого сокета.
LOCAL_CREDS
Существует опция на уровне сокета для setsockopt() и getsockopt(), доступная в UNIX-домене. Параметр LOCAL_CREDS может быть включен для сокета SOCK_DGRAM или SOCK_STREAM. Данная опция предоставляет получателю механизм для получения учетных данных процесса в виде сообщения recvmsg(). Поле msg_control в структуре msghdr указывает на буфер, который содержит структуру cmsghdr, за которой следует структура sockcred переменной длины, определенная в <sys/socket.h> следующим образом:
struct sockcred {uid_t sc_uid; /* real user id */uid_t sc_euid; /* effective user id */gid_t sc_gid; /* real group id */gid_t sc_egid; /* effective group id */int sc_ngroups; /* number of supplemental groups */gid_t sc_groups[1]; /* variable length */};
Макрос SOCKCREDSIZE() вычисляет размер структуры sockcred для заданного количества групп. Поля cmsghdr имеют следующие значения:
cmsg_len = sizeof( struct cmsghdr ) + SOCKCREDSIZE( ngroups )cmsg_level = SOL_SOCKETcmsg_type = SCM_CREDS
bind(), connect(), dup(), getpeereid(), getsockopt(), recvmsg(), sendmsg(), sendto(), setsockopt(), socket(), unlink()
Предыдущий раздел: Описание API сетевой библиотеки