Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sp.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
213.38 Кб
Скачать

32. Использование каналов и почтовых ящиков для обмена данными

Неименованные транспортеры (Anonymous Pipe)

Один из классических способов взаимодействия процессов, известный еще в UNIX. С помощью функции CreatePipe процесс создает два описателя: один для чтения, другой для записи. Эти описатели аналогичны описателям файлов в том смысле, что с ними можно работать файловыми функциями ReadFile и WriteFile. Если породить дочерний процесс так, чтобы он наследовал описатели, то можно использовать описатели транспортера для взаимодействия процессов. Можно предложить следующую схему взаимодействия:

 Именованные транспортеры (NamedPipes)

Аналогичны предыдущим за исключением того, что при создании транспортеру присваивается уникальное глобальное имя вида \\.\pipe\<pipename>. Процесс, породивший транспортер называется сервером. Процесс, который присоединяется к транспортеру, называется клиентом. Клиент может присоединяться к серверу, находящемуся на удаленном компьютере в сети. Для обслуживания одновременно нескольких клиентов обычно порождаются несколько потоков.

Именованный трубопровод создается функцией CreateNamedPipe, возвращающей описатель (тип HANDLE) созданного объекта. Для дальнейшего использования его необходимо открыть функцией CreateFile по данному ранее имени, либо применяя специфические функции работы с трубопроводами, например, ConnectNamedPipe или TransactNamedPipe. Созданный объект удаляется универсальной функцией CloseHandle.

Почтовые ящики (MailSlots)

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

Почтовый ящик создается функцией CreateMailslot, причем используется имя вида \\.\mailslot\[<path>\]<slotname>, где собственно имя ящика может включать символы ‘\’, не имея соответствия в реальной структуре каталогов (т.н. псевдодиректории). Для доступа к ящику файловыми функциями его надо открыть функцией CreateFile с использованием следующих вариантов имени файла:

\\.\mailslot\<slot_name> – локальныйящик;

\\<computer_name>\mailslot\<slot_name> – удаленныйящик;

\\<domain_name>\mailslot\<slot_name> – используядоменноеимя;

\\*\mailslot\<slot_name> – используяпервичный (primary) доменсистемы.

В ящик, открытый через доменное имя, нельзя записывать более 400 байт в один прием.

Если ящик будет использоваться более чем одним процессом (владельцем), то CreateFile должен задавать флаг доступа FILE_SHARE_READ.

Созданный ящик существует до тех пор, пока существует процесс-владелец, либо пока владелец или его потомок не удалят его описатель вызовом CLOSE_HANDLE.

 Сокеты (Socket).

Существующий практически во всех сетевых ОС механизм межпроцессного взаимодействия в локальных системах и в сети, предусмотренных моделью взаимодействия открытых систем (OSI). Для идентификации участника взаимодействия используются пара параметров: сетевое имя или адрес машины плюс номер порта. Адреса записываются в соответствии с требованиями одного из семейств адресов (addresses family), например, IP-адреса­ции. Таким образом, сокеты являются программной надстройкой на унифицированном сетевом интерфейсе портов сеансового уровня модели OSI..

Сокеты обеспечивают решение практически всех задач межпроцессного (межпрограммного) взаимодействия независимо от физического размещения программ:

– взаимное обнаружение и идентификация;

– синхронизация;

– передача данных без установления соединения (пакетная, датаграммная);

– передача с установлением соединения (потоковая, виртуальный канал).

В Win 32 сокет является системным объектом, доступным посредством его описателя, тип данных SOCKET, совместим с HANDLE. Предоставляется ряд функций API для работы с ними.

socket – создание сокета. Задаются семейство адресов, тип сокета и протокол.

closesocket – закрытие сокета (действие системного объекта прекращается функцией CloseHandle).

bind – связывание сокета с ресурсом системы.

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

accept – подтверждение соединения.

send – посылка через сокет с установленным соединением.

sendto – посылка с явным указанием адресата. Предварительное установление соединения не требуется.

recv – прием из сокета с установленным соединением.

recvfrom – прием из сокета с явным указанием корреспондента. Предварительное установление соединения не требуется.

ioctlsocket – управление сокетом

а также вспомогательные функции для анализа текущего состояния сокета, конфигурирования, преобразования имен, адресов и форматов данных.

Пока что доп. информацию см. в MSDN и курсах "ОСиС", "ВСиС".

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]