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

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

Жанры

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

Троан Эрик В.

Шрифт:

Вызов

accept
превращает отложенное соединение в установленное. Установленное соединение получает новый файловый дескриптор, который возвращает функция
accept
. Новый дескриптор наследует все атрибуты того сокета, к которому обращалась функция
listen
. Необычное свойство
accept
состоит в том, что она возвращает сетевые ошибки, ожидающие обработки, как ошибки принятия от
accept
[122] . При возврате ошибки серверы не должны прерывать работу, если параметр
errno
принимает одно из следующих значений:
ECONNABORTED
,
ENETDOWN
,
EPROTO
,
ENOPROTOOPT
,
EHOSTDOWN
,
ENONET
,
EHOSTUNREACH
,
EOPNOTSUPP
или
ENETUNREACH
. Все эти ошибки необходимо игнорировать, просто вызвав функцию
accept
на сервере еще раз.

122

Варианты BSD не поддерживают такую модель поведения, в таких системах ошибки проходят без отчетов.

Параметры

addr
и
addrlen
указывают данные, в которых ядро размещает адрес удаленного (клиентского) конца соединения. В исходном состоянии
addrlen
представляет собой целое число, содержащее размер буфера, на который ссылается
addr
. Функция
accept
аналогично open возвращает файловый дескриптор или некоторое отрицательное значение, если возникла ошибка.

17.3.5. Подключение к серверу

Как и серверы, клиенты могут сразу после создания сокета связывать с ним локальный адрес. Обычно клиент пропускает этот шаг, предоставляя ядру присвоить сокету любой подходящий локальный адрес.

После этапа связывания (который, впрочем, может быть пропущен) клиент соединяется с сервером через системный вызов

connect
.

#include <sys/socket.h>

int connect(int sock, struct sockaddr * servaddr, socklen_t addrlen);

Процесс переходит к подключению, придерживаясь адреса, с которым должен соединиться сокет.

На рис. 17.1 показаны системные вызовы, которые обычно используются для установки соединений сокетов, и порядок, в котором они выполняются.

Рис 17.1. Установка соединений сокетов

17.3.6. Поиск адресов соединения

После того как соединение установлено, приложение может найти адреса как удаленного, так и локального концов сокета с помощью функций

getpeername
и
getsockname
.

#include <sys/socket.h>

int getpeername(int s, struct sockaddr * addr, socklen_t * addrlen);

int getsockname(int s, struct sockaddr * addr, socklen_t * addrlen);

Обе функции передают адреса соединений сокета s в те структуры, на которые указывают их параметры

addr
. Адрес удаленной стороны возвращается функцией
getpeername
, тогда как
getsockname
сообщает адрес локальной части соединения. Для обеих функций в качестве первоначального целочисленного значения, на которое указывает параметр
addrlen
, должен быть установлен
размер пространства, которое выделяется параметром
addr
. Это целое число заменяется количеством байт в возвращаемом адресе.

17.4. Сокеты домена Unix

Сокеты домена Unix — это простейшее семейство протоколов, доступное через API- интерфейс сокетов. Они фактически не являются сетевыми протоколами, поскольку могут соединяться с сокетами только на одном и том же компьютере. Несмотря на то что это значительно ограничивает их полезность, они все же используются многими приложениями благодаря гибкому механизму IPC, который они поддерживают. Их адреса — это путевые имена, которые создаются в файловой системе, когда сокет привязывается к путевому имени. Файлы сокетов, представляющие адреса доменов Unix, могут быть запущены функцией

stat
, но не могут быть открыты с помощью
open
; вместо этого нужно использовать API сокетов.

Домен Unix предусматривает как дейтаграммные, так и потоковые интерфейсы. Дейтаграммный интерфейс используется редко, и здесь обсуждаться не будет. Мы рассмотрим потоковый интерфейс, работа которого подобна именованным каналам. При этом сокеты домена Unix, однако, не идентичны именованным каналам.

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

Сокеты домена Unix работают на основе соединений; в результате каждого соединения с сокетом возникает новый канал связи. Сервер, который может обрабатывать множество соединений одновременно, сохраняет для каждого из них свой файловый дескриптор. Благодаря этому свойству сокеты домена Unix лучше подходят для выполнения многих задач IPC, чем именованные каналы. Это главная причина, по которой они применяются большинством стандартных служб Linux, включал X Window System и системный регистратор.

17.4.1. Адреса домена Unix

Адреса для сокетов домена Unix являются путевыми именами в файловой системе. Если файл еще не существует, то он создается как файл сокетного типа в тот момент, когда сокет привязывается к путевому имени через функцию

bind
. Если уже существует файл (или даже сокет) с указанным путевым именем, то функция
bind
завершается и возвращает значение
EADDRINUSE
,
bind
устанавливает права доступа для созданного файла сокета равными 0666, как измененные текущей маской umask.

Для того чтобы присоединиться к существующему сокету, процесс должен иметь права на чтение и запись в файл сокета [123] .

Адреса сокетов домена Unix передаются через структуру

struct sockaddr_un
.

#include <sys/socket.h>

#include <sys/un.h>

struct sockaddr_un {

 unsigned short sun_family; /* AF_UNIX */

 char sun_path[UNIX_PATH_MAX]; /* путевое имя */

123

И для

bind
, и для
connect
процесс должен иметь права на выполнение для каталогов, через которые проходит поиск путевого имени (почти как при открытии стандартных файлов).

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

Неудержимый. Книга VIII

Боярский Андрей
8. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
6.00
рейтинг книги
Неудержимый. Книга VIII

Законы Рода. Том 6

Flow Ascold
6. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 6

Восход. Солнцев. Книга I

Скабер Артемий
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга I

Попаданка

Ахминеева Нина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Попаданка

Возлюби болезнь свою

Синельников Валерий Владимирович
Научно-образовательная:
психология
7.71
рейтинг книги
Возлюби болезнь свою

Кодекс Крови. Книга III

Борзых М.
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга III

Ротмистр Гордеев 2

Дашко Дмитрий
2. Ротмистр Гордеев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ротмистр Гордеев 2

Идеальный мир для Лекаря 5

Сапфир Олег
5. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 5

Адвокат Империи 3

Карелин Сергей Витальевич
3. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 3

Жребий некроманта 3

Решетов Евгений Валерьевич
3. Жребий некроманта
Фантастика:
боевая фантастика
5.56
рейтинг книги
Жребий некроманта 3

Город драконов

Звездная Елена
1. Город драконов
Фантастика:
фэнтези
6.80
рейтинг книги
Город драконов

Убивать, чтобы жить

Бор Жорж
1. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать, чтобы жить

Инквизитор Тьмы 2

Шмаков Алексей Семенович
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 2

Беглец

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