Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 43 стр.

UptoLike

Составители: 

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