Семейство протоколов 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 сетевой библиотеки