ВУЗ:
Составители:
43
необходимо иметь права на чтение этого файла. Обычно такие файлы размещаются в
директории /tmp. Особенностью локального пространства имен является то, что имя
файла используется только при открытии соединения.
Еще одной особенностью является то, что невозможно подключиться к такого
типа гнезду с другого компьютера даже если они используют разделяемую файловую
систему, содержащую имя гнезда. После окончания использования гнезда в локальном
пространстве имен необходимо удалить файл с помощью функций unlink или remove.
Локальное пространство имен поддерживает только один протокол; этот
протокол имеет номер “0”.
Для создания гнезда используйте константу PF_LOCAL в качестве аргумента
NAMESPACE функций socket и socketpair. Структура для описания имени гнезда
определена в заголовочном файле <sys/un.h>.
struct sockaddr_un {
short int sun_family;
char sun_path[108];
};
Здесь sun_family определяет формат адреса гнезда. Для локального
пространства имен это поле должно содержать значение AF_LOCAL, sun_path – имя
файла, которое должно использоваться в качестве имени гнезда.
Параметр LENGTH функции bind должен был установлен как сумма поля
sun_family и длины строки имени файла (не выделенного размера поля sun_path!). Для
вычисления значения LENGTH может использоваться макрос SUN_LEN:
int SUN_LEN (_struct sockaddr_un *_ PTR)
Приведем пример создания и именования гнезд локального пространства имен:
#include <stddef.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/un.h>
int make_named_socket (const char *filename)
{
struct sockaddr_un name;
int sock;
size_t size;
sock = socket (PF_LOCAL, SOCK_DGRAM, 0);
if (sock < 0)
{
perror ("socket");
exit (EXIT_FAILURE);
}
name.sun_family = AF_LOCAL;
strncpy (name.sun_path, filename, sizeof (name.sun_path));
size = (offsetof (struct sockaddr_un, sun_path)
+ strlen (name.sun_path) + 1);
if (bind (sock, (struct sockaddr *) &name, size) < 0)
{
perror ("bind");
exit (EXIT_FAILURE);
}
return sock;
необходимо иметь права на чтение этого файла. Обычно такие файлы размещаются в директории /tmp. Особенностью локального пространства имен является то, что имя файла используется только при открытии соединения. Еще одной особенностью является то, что невозможно подключиться к такого типа гнезду с другого компьютера даже если они используют разделяемую файловую систему, содержащую имя гнезда. После окончания использования гнезда в локальном пространстве имен необходимо удалить файл с помощью функций unlink или remove. Локальное пространство имен поддерживает только один протокол; этот протокол имеет номер “0”. Для создания гнезда используйте константу PF_LOCAL в качестве аргумента NAMESPACE функций socket и socketpair. Структура для описания имени гнезда определена в заголовочном файле. struct sockaddr_un { short int sun_family; char sun_path[108]; }; Здесь sun_family определяет формат адреса гнезда. Для локального пространства имен это поле должно содержать значение AF_LOCAL, sun_path – имя файла, которое должно использоваться в качестве имени гнезда. Параметр LENGTH функции bind должен был установлен как сумма поля sun_family и длины строки имени файла (не выделенного размера поля sun_path!). Для вычисления значения LENGTH может использоваться макрос SUN_LEN: int SUN_LEN (_struct sockaddr_un *_ PTR) Приведем пример создания и именования гнезд локального пространства имен: #include #include #include #include #include #include int make_named_socket (const char *filename) { struct sockaddr_un name; int sock; size_t size; sock = socket (PF_LOCAL, SOCK_DGRAM, 0); if (sock < 0) { perror ("socket"); exit (EXIT_FAILURE); } name.sun_family = AF_LOCAL; strncpy (name.sun_path, filename, sizeof (name.sun_path)); size = (offsetof (struct sockaddr_un, sun_path) + strlen (name.sun_path) + 1); if (bind (sock, (struct sockaddr *) &name, size) < 0) { perror ("bind"); exit (EXIT_FAILURE); } return sock; 43
Страницы
- « первая
- ‹ предыдущая
- …
- 41
- 42
- 43
- 44
- 45
- …
- следующая ›
- последняя »