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

UptoLike

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

40
3. для каждой комбинации способа и пространства имен существует протокол
по умолчанию, который можно запросить, указав 0 в качестве номера
протокола.
Способы взаимодействия
Стандартная библиотека Linux включает поддержку нескольких типов гнезд,
обладающих различными характеристиками. Опишем поддерживаемые типы гнезд.
Символьные константы, используемые для обозначения типов перечислены в
заголовочном файле <sys/socket.h>.
int SOCK_STREAM этот способ аналогичен каналам, он работает с удаленным
гнездом и передает данные в виде потока байтов;
int SOCK_DGRAM этот способ предназначен для индивидуально-адресуемых
пакетов, однако пакет может не достигнуть адресата. Каждая
запись некоторого набора данных формирует пакет. Так как
гнезда такого типа не имеют постоянного соединения, адрес
нужно указывать для каждого передаваемого пакета.
Единственное, что гарантируется при использовании такого
типа гнездпопытка операционной системы отправить те
пакеты, которые посылаются клиентской программой.
Некоторые пакеты могут быть не доставлены, очередность
доставки пакетов может быть нарушена. Обычный случай
использования таких пакетов приложения, где возможна
повторная попытка в случае, если подтверждение получения не
пришло в разумное время и приложения, где скорость передачи
данных важнее надежности;
int SOCK_RAW этот способ дает доступ к низкоуровневым сетевым
протоколам и интерфейсам. Обычным пользовательским
программам нет необходимости в использовании такого типа
гнезд.
Адреса гнезд
Имя гнезда обычно называется адресом. Гнездо, созданное с помощью
функции socket, не имеет адреса. Другие процессы могут найти его для взаимодействия
если только идентифицировать с этим гнездом адрес. Эта операция называется
привязкойадреса и выполняется она функцией bind.
Формат адреса гнезда зависит от используемого пространства имен.
Независимо от пространства имен для установки и определения адреса гнезда
используются функции bind и getsockname. Эти функции используют общую структуру
sockaddr для представления указателя на адрес гнезда. Однако, используя эту структуру
невозможно эффективно интерпретировать или сконструировать адрес из-за того, что
адреса различных пространств имен имеют различные типы данных. Наиболее
распространенным способом является формирование адреса в переменной, имеющей
подходящий тип данных, а затем преобразовать указатель на переменную в указатель
‘struct sockaddr *’. Тем не менее, из типа данных sockaddr можно получить
идентификатор формата адреса, который будет использоваться в данном пространстве
имен.
Структура sockaddr определена следующим образом:
struct sockaddr {
short int sa_family;
char sa_data[14];
  3.        для каждой комбинации способа и пространства имен существует протокол
            по умолчанию, который можно запросить, указав 0 в качестве номера
            протокола.

        Способы взаимодействия
        Стандартная библиотека Linux включает поддержку нескольких типов гнезд,
обладающих различными характеристиками. Опишем поддерживаемые типы гнезд.
Символьные константы, используемые для обозначения типов перечислены в
заголовочном файле .
int SOCK_STREAM       этот способ аналогичен каналам, он работает с удаленным
                      гнездом и передает данные в виде потока байтов;
int SOCK_DGRAM        этот способ предназначен для индивидуально-адресуемых
                      пакетов, однако пакет может не достигнуть адресата. Каждая
                      запись некоторого набора данных формирует пакет. Так как
                      гнезда такого типа не имеют постоянного соединения, адрес
                      нужно указывать для каждого передаваемого пакета.
                      Единственное, что гарантируется при использовании такого
                      типа гнезд – попытка операционной системы отправить те
                      пакеты, которые посылаются клиентской программой.
                      Некоторые пакеты могут быть не доставлены, очередность
                      доставки пакетов может быть нарушена. Обычный случай
                      использования таких пакетов – приложения, где возможна
                      повторная попытка в случае, если подтверждение получения не
                      пришло в разумное время и приложения, где скорость передачи
                      данных важнее надежности;
 int SOCK_RAW         этот способ дает доступ к низкоуровневым сетевым
                      протоколам и интерфейсам. Обычным пользовательским
                      программам нет необходимости в использовании такого типа
                      гнезд.

        Адреса гнезд
        Имя гнезда обычно называется адресом. Гнездо, созданное с помощью
функции socket, не имеет адреса. Другие процессы могут найти его для взаимодействия
если только идентифицировать с этим гнездом адрес. Эта операция называется
“привязкой” адреса и выполняется она функцией bind.
        Формат адреса гнезда зависит от используемого пространства имен.
Независимо от пространства имен для установки и определения адреса гнезда
используются функции bind и getsockname. Эти функции используют общую структуру
sockaddr для представления указателя на адрес гнезда. Однако, используя эту структуру
невозможно эффективно интерпретировать или сконструировать адрес из-за того, что
адреса различных пространств имен имеют различные типы данных. Наиболее
распространенным способом является формирование адреса в переменной, имеющей
подходящий тип данных, а затем преобразовать указатель на переменную в указатель
‘struct sockaddr *’. Тем не менее, из типа данных sockaddr можно получить
идентификатор формата адреса, который будет использоваться в данном пространстве
имен.
        Структура sockaddr определена следующим образом:
       struct sockaddr {
            short int   sa_family;
            char        sa_data[14];



       40