UNIX

Семейство протоколов 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_SOCKET
cmsg_type = SCM_CREDS

Тематические ссылки:

bind(), connect(), dup(), getpeereid(), getsockopt(), recvmsg(), sendmsg(), sendto(), setsockopt(), socket(), unlink()




Предыдущий раздел: Описание API сетевой библиотеки