Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

13: struct sockaddr_un address;

14: int sock;

15: size_t addrLength;

16:

17: if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)

18: die("socket");

19:

20: address.sun_family = AF_UNIX; /* сокет домена Unix */

21: strcpy(address.sun_path, "./sample-socket");

22:

23: /* Общая длина адреса, включая элемент

24: sun_family */

25: addrLength = sizeof(address.sun_family) +

26: strlen(address.sun_path);

27:

28: if (connect(sock, (struct sockaddr *) &address, addrLength))

29: die("connect");

30:

31: copyData(0, sock);

32:

33: close(sock);

34:

35: return 0;

36: }

Клиент

не особенно отличается от сервера. Единственные изменения состоят в том, что последовательность функций
bind
,
listen
,
accept
заменяется одним вызовом
connect
, при этом копируется немного другой набор данных.

17.4.4. Запуск примеров домена Unix

Две предыдущие программы-примера (серверная и клиентская) сконструированы для совместной работы. Запустите сервер с одного терминала, после этого активизируйте клиента из другого терминала (но в том же самом каталоге). При вводе строк в клиентской программе они автоматически передаются через сокет на сервер. После того, как вы завершите работу клиента, сервер будет ожидать следующего соединения. Вы можете передавать файлы через сокет путем переадресации входных данных в клиентскую программу.

17.4.5. Неименованные сокеты домена Unix

Благодаря тому, что сокеты домена Unix обладают некоторыми преимуществами перед каналами (например, они являются полнодуплексными), они часто используются в качестве механизма IPC. Для того чтобы облегчить этот процесс, вводится системный вызов

socketpair
.

#include <sys/socket.h>

int socketpair(int domain, int type, int protocol, int sockfds[2]);

Первые три параметра совпадают с теми, которые передаются в

socket
. Последний параметр
sockfds
заполняется функцией
socketpair
двумя файловыми дескрипторами (по одному для каждой стороны сокета).

Пример применения

socketpair
показан далее в главе.

17.4.6. Передача файловых дескрипторов

Сокеты домена Unix обладают уникальным свойством: через них могут передаваться файловые дескрипторы. Ни один из прочих механизмов IPC не поддерживает подобную возможность. Она позволяет процессу открыть файл и передать файловый дескриптор в другой (возможно, несвязанный) процесс. Все проверки доступа выполняются при открытии файла, поэтому получающий процесс приобретает те же самые права доступа к файлу, что и исходный процесс.

Файловые дескрипторы передаются как часть более сложного сообщения, которое отправляется с помощью системного вызова

sendmsg
и принимается через
recvmsg
.

#include <sys/socket.h>

int sendmsg(int fd, const struct msghdr * msg, unsigned int flags);

int recvmsg(int fd, struct msghdr * msg, unsigned int flags);

Параметр

fd
является файловым дескриптором,
через который передается сообщение; второй параметр служит указателем на структуру, описывающую сообщение. Параметр
flags
обычно не используется и для большинства приложений должен быть равен нулю. В специализированных книгах по программированию для сетей обсуждаются доступные флаги [33].

Сообщение описывается показанной ниже структурой.

#include <sys/socket.h>

#include <sys/un.h>

struct msghdr {

 void * msg_name; /* дополнительный адрес */

 unsigned int msg_namelen; /* размер msg_name */

 struct iovec * msg_iov; /* массив для чтения вразброс/сборной записи*/

 unsigned int msg_iovlen; /* количество элементов в msg_iov */

 void * msg_control; /* вспомогательные данные */

 unsigned int msg_controllen;/* длина буфера вспомогательных данных */

 int msg_flags; /* флаги на получаемом сообщении */

};

Первые два члена

msg_name
и
msg_namelen
не используются в потоковых протоколах. Приложения, посылающие сообщения через потоковые сокеты, должны устанавливать для
msg_name
значение
NULL
, для
msg_namelen
— ноль.

msg_iov
и
msg_iovlen
описывают набор буферов, которые отправляют или принимают. Чтение вразброс и сборная запись, а также
struct iovec
, обсуждаются в конце главы 13. Последний член структуры
msg_flags
в настоящее время не используется и должен равняться нулю.

Два элемента, которые мы пропустили,

msg_control
и
msg_controllen
предоставляют возможность передачи файлового дескриптора. Член
msg_control
указывает на массив заголовков управляющих сообщений;
msg_controllen
устанавливает количество байт, которые содержит массив. Каждое управляющее сообщение состоит из структуры
struct cmsghdr
, которая сопровождается дополнительными данными.

#include <sys/socket.h>

struct cmsghdr {

 unsigned int cmsg_len; /* длина управляющего сообщения */

 int cmsg_level; /* SOL_SOCKET */

 int cmsg_type; /* SCM_RIGHTS */

 int cmsg_data[0]; /* здесь должен быть файловый дескриптор */

};

Размер управляющего сообщения, включая заголовок, хранится в переменной

cmsg_len
. В текущий момент определен только один тип управляющих сообщений —
SCM_RIGHTS
, который передает файловые дескрипторы [125] . Для данного типа сообщений параметры
cmsg_level
и
cmsg
_type должны быть равны соответственно
SOL_SOCKET
и
SCM_RIGHTS
. Последний член
cmsg_data
является массивом нулевого размера. Это расширение gcc, которое позволяет приложению копировать данные в конец структуры (в следующей программе показан пример).

125

Это иногда называется передачей прав доступа.

Поделиться:
Популярные книги

Жалкая

Макинтайер Эмили
3. Долго и Несчастливо
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Жалкая

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Академия проклятий. Книги 1 - 7

Звездная Елена
Академия Проклятий
Фантастика:
фэнтези
8.98
рейтинг книги
Академия проклятий. Книги 1 - 7

Измена. Верни мне мою жизнь

Томченко Анна
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Верни мне мою жизнь

Измена

Рей Полина
Любовные романы:
современные любовные романы
5.38
рейтинг книги
Измена

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Сердце для стража

Каменистый Артем
5. Девятый
Фантастика:
фэнтези
боевая фантастика
9.20
рейтинг книги
Сердце для стража

Черный Маг Императора 11

Герда Александр
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Черный Маг Императора 11

Имя нам Легион. Том 3

Дорничев Дмитрий
3. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 3

Жена фаворита королевы. Посмешище двора

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Жена фаворита королевы. Посмешище двора

Как я строил магическую империю 5

Зубов Константин
5. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 5

Блуждающие огни 2

Панченко Андрей Алексеевич
2. Блуждающие огни
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Блуждающие огни 2

Ратник

Ланцов Михаил Алексеевич
3. Помещик
Фантастика:
альтернативная история
7.11
рейтинг книги
Ратник

Маленькая слабость Дракона Андреевича

Рам Янка
1. Танцы на углях
Любовные романы:
современные любовные романы
эро литература
5.25
рейтинг книги
Маленькая слабость Дракона Андреевича