Каналы передачи данных
Каналы передачи как средство межпроцессного обмена данными, их возможности и разновидности. Наиболее важные функции программного интерфейса Windows, предназначенные для работы с каналами Pipes. Частные способы использования канала и флаги защиты.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 06.10.2010 |
Размер файла | 41,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
КАНАЛЫ ПЕРЕДАЧИ ДАННЫХ
Каналы (pipe) как средство межпроцессного обмена данными впервые появилось в операционной системе UNIX. Канал позволяет:
- организовать передачу данных между локальными процессами,
- организовать передачу данных между процессами, запущенными на различных рабочих станциях в сети.
Приложения могут выполнять над каналами Pipe синхронные или асинхронные операции. В случае использования асинхронных операций необходимо отдельно побеспокоиться об организации синхронизации.
Существуют две разновидности каналов Pipe:
- анонимные (Anonymous Pipes);
- именованные (Named Pipes).
Анонимные каналы обычно используются для организации передачи данных между родительскими и дочерними процессами, запущенными на одной рабочей станции или на “отдельно стоящем” компьютере.
Суть: канал представляет собой буфер в оперативной памяти, поддерживающий очередь байт по алгоритму FIFO. Для программиста, использующего системный вызов pipe, этот буфер выглядит как безымянный файл, в который можно писать и читать, осуществляя тем самым обмен данными только между двумя процессами. Один из процессов создает канал, другой открывает его. После этого оба процесса могут передавать данные через канал в одну или обе стороны.
Как видно из названия, именованным каналам при создании присваивается имя, которое доступно для других процессов. Имя является записью в каталоге файловой системы ОС, поэтому каналы пригодны для обмена данными между двумя произвольными процессами или потоками этих процессов. Зная имя какой-либо рабочей станции в сети, процесс может получить доступ к каналу, созданному на этой рабочей станции.
Имена каналов отвечают стандарту UNC (Unification Name Convention - универсальное соглашение назначения имен), используемым в Windows для обращения к разделяемым томам, принтерам и файлам. Применительно к каналам имена имеют следующий вид:
\\ИмяСервера\pipe\ИмяКанала
Если процесс открывает канал, созданный на другой рабочей станции, он должен указать имя сервера.
Если же процесс создает канал или открывает канал на своей рабочей станции, вместо имени указывается символ точки:
\\ .\pipe\ИмяКанала
В любом случае процесс может создать канал только на той рабочей станции, где он запущен, поэтому при создании канала имя сервера никогда не указывается.
В простейшем случае один серверный процесс создает один канал для работы с одним клиентским процессом.
Однако часто требуется организовать взаимодействие одного серверного процесса с несколькими клиентскими. Например, сервер базы данных может принимать от клиентов запросы и рассылать ответы на них.
В случае такой необходимости серверный процесс может создать несколько реализаций канала, по одной реализации для каждого клиентского процесса.
ФУНКЦИИ ДЛЯ РАБОТЫ С КАНАЛАМИ
Рассмотрим наиболее важные функции программного интерфейса Windows, предназначенные для работы с каналами Pipes, которые сведем в таблицу 1.
Таблица 1
Функции для работы с каналами
№ п/п |
Функция |
Назначение |
|
1. |
CreatePipe() |
Создание анонимного канала |
|
2. |
CreateNamedPipe() |
Создание именованного канала |
|
3. |
ConnectNamedPipe() |
Установка соединения с каналом со стороны сервера |
|
4. |
CreateFile() |
Установка соединения с каналом со стороны клиента |
|
5. |
DisconnectNamedPipe() |
Отключение серверного процесса от клиентского процесса |
|
6. |
CloseHandle() |
Закрытие хэндла канала |
|
7. |
WriteFile() |
Запись данных в открытый канал |
|
8. |
ReadFile() |
Чтения данных из канала |
|
9. |
PeekNamedPipe() |
Чтения данных из канала без удаления |
|
10. |
CallNamedPipe() |
Прием/передача данных от канала |
|
11. |
TransactNamedPipe() |
Прием/передача данных от канала |
|
12. |
WaitNamedPipe() |
Ожидание процессом доступа к каналу для соединения |
|
13. |
SetNamedPipeHandleState() |
Изменить режимы работы для уже созданного канала. |
|
14. |
GetNamedPipeHandleState() |
Определить состояние канала. |
|
15. |
GetNamedPipeInfo() |
Получить информацию об именованном канале |
Для создания анонимных каналов Pipes используется функция CreatePipe(), синтаксис которой следующий
BOOL CreatePipe ( HANDLE hReadPipe, HANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize)
Параметры:
hReadPipe - хэндл переменной, в которую будет записан идентификатор канала для чтения данных.
hWritePipe - хэндл переменной, в которую будет записан идентификатор канала для записи данных.
lpPipeAttributes - указатель на атрибуты защиты.
nSize - количество байт памяти, зарезервированной для канала.
Возвращаемое значение. При успешном выполнении - TRUE, при ошибке - FALSE. В последнем случае для уточнения причины возникновения ошибки можно воспользоваться функцией GetLastError().
Канал может использоваться как для записи в него данных, так и для чтения. Поэтому при создании канала функция CreatePipe() возвращает два хэндла, записывая их по адресу, заданному в параметрах hReadPipe и hWritePipe.
Хэндл, записанный по адресу hReadPipe, можно передавать в качестве параметра функции ReadFile() или ReadFileEx() для выполнения операции чтения.
Идентификатор, записанный по адресу hWritePipe, передается функции WriteFile() или WriteFileEx() для выполнения операции записи.
Через параметр lpPipeAttributes передается адрес переменной, содержащей атрибуты защиты для создаваемого канала. На текущий момент будем указывать этот параметр как NULL. В результате канал будет иметь атрибуты защиты, принятые по умолчанию.
Параметр nSize определяет размер буфера для создаваемого канала. Если этот размер указан как нуль, будет создан буфер с размером, принятым по умолчанию. Заметим, что при необходимости система может изменить указанный вами размер буфера.
Для создания именованного канала Pipe необходимо использовать функцию CreateNamedPipe(), синтаксис которой следующий
HANDLE CreateNamedPipe (LPCTSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Параметры:
lpName - указатель на строку имени канала.
dwOpenMode - режим открытия канала.
dwPipeMode - режим работы канала.
nMaxInstances - максимальное количество реализаций канала.
nOutBufferSize - размер выходного буфера в байтах.
nInBufferSize - размер входного буфера в байтах.
nDefaultTimeOut - время ожидания в миллисекундах.
lpSecurityAttributes - указатель на атрибуты защиты.
Возвращаемое значение. При успешном выполнении - хэндл созданной реализации канала, при ошибке - INVALID_HANDLE_VALUE. Код ошибки уточняется при вызове функции GetLastError().
Через параметр lpName передается указатель на строку имени канала в форме \\ .\pipe\ИмяКанала. При создании канала имя сервера не указывается, так как канал можно создать только на той рабочей станции, где запущен процесс, создающий канал.
Параметр dwOpenMode задает режим, в котором открывается канал.
1. Способы передачи данных через канал. Канал Pipe может быть ориентирован:
- либо на передачу потока байт (по умолчанию);
- либо на передачу сообщений.
В первом случае данные через канал передаются по байтам (задается константой PIPE_TYPE_BYTE), во втором - отдельными блоками заданной длины (задается константой PIPE_TYPE_MESSAGE).
2. Общие способы использования канала. Можно указать, будет ли данный канал использован только для чтения данных, только для записи или одновременно для чтения и записи (табл.2). Эти параметры должны быть одинаковы для всех реализаций канала.
Таблица 2
Общие
Константа |
Использование канала |
|
PIPE_ACCESS_INBOUND |
Только для чтения |
|
PIPE_ACCESS_OUTBOUND |
Только для записи |
|
PIPE_ACCESS_DUPLEX |
Для чтения и записи |
3. Частные способы использования канала. Эти параметры могут отличаться для разных реализаций канала (табл.3).
Таблица 3
Частные способы использования канала
Константа |
Использование канала |
|
PIPE_READMODE_BYTE |
Канал открывается на чтение в режиме последовательной передачи отдельных байт |
|
PIPE_READMODE_MESSAGE |
Канал открывается на чтение в режиме передачи отдельных сообщений указанной длины |
|
PIPE_WAIT |
Канал будет работать в блокирующем режиме, когда процесс переводится в состояние ожидания до завершения операций в канале |
|
PIPE_NOWAIT |
Неблокирующий режим работы канала. Если операция не может быть выполнена немедленно, в неблокирующем режиме функция завершается с ошибкой |
|
FILE_FLAG_OVERLAPPED |
Использование асинхронных операций (ввод и вывод с перекрытием). Данный режим позволяет процессу выполнять полезную работу параллельно с проведением операций в канале |
|
FILE_FLAG_WRITE_THROUGH |
В этом режиме функции, работающие с каналом, не возвращают управление до тех пор, пока не будет полностью завершена операция на удаленном компьютере. Используется только с каналом, ориентированном на передачу отдельных байт и только в том случае, когда канал создан между процессами, запущенными на различных станциях сети |
4. Флаги защиты. Дополнительно к перечисленным флагам через параметр dwOpenMode можно передавать флаги защиты (табл.4)
Таблица 4
Флаги защиты
Флаг |
Описание |
|
WRITE_DAC |
Вызывающий процесс должен иметь права доступа на запись к произвольному управляющему списку доступа именованного канала access control list (ACL) |
|
WRITE_OWNER |
Вызывающий процесс должен иметь права доступа на запись к процессу, владеющему именованным каналом Pipe |
|
ACCESS_SYSTEM_SECURITY |
Вызывающий процесс должен иметь права доступа на запись к управляющему списку доступа именованного канала access control list (ACL) |
Параметр dwPipeMode. Определяет режим работы канала. В этом параметре можно указать перечисленные выше константы:
PIPE_TYPE_BYTE,
PIPE_TYPE_MESSAGE,
PIPE_READMODE_BYTE,
PIPE_READMODE_MESSAGE,
PIPE_WAIT
PIPE_NOWAIT.
Для всех реализаций канала необходимо указывать один и тот же набор констант.
Параметр nMaxInstances определяет максимальное количество реализаций, которые могут быть созданы для канала. Можно указывать здесь значения от 1 до PIPE_UNLIMITED_INSTANCES. В последнем случае максимальное количество реализаций ограничивается только наличием свободных системных ресурсов.
Заметим, что если один серверный процесс использует несколько реализаций канала для связи с несколькими клиентскими, то общее количество реализаций может быть меньше, чем потенциальное максимальное количество клиентов. Это связано с тем, что клиенты могут использовать реализации по очереди, если только они не пожелают связаться с серверным процессом все одновременно.
Параметры nOutBufferSize и nInBufferSize определяют, соответственно, размер буферов, используемых для записи в канал и чтения из канала. При необходимости система может использовать буферы других, по сравнению с указанными, размеров.
Параметр nDefaultTimeOut определяет время ожидания для реализации канала. Для всех реализаций необходимо указывать одинаковое значение этого параметра.
Через параметр lpPipeAttributes передаются атрибуты защиты для создаваемого канала. На текущий момент приложениях мы будем указывать этот параметр как NULL. В результате канал будет иметь атрибуты защиты, принятые по умолчанию.
Пример 1. Создадим именованный канала с именем $MyPipe$, используя функцию CreateNamedPipe(), и предназначенного для чтения и записи данных, работающего в блокирующем режиме и допускающем создание неограниченного количества реализаций:
HANDLE hNamedPipe;
LPSTR lpszPipeName = "\\\\.\\pipe\\$MyPipe$";
hNamedPipe = CreateNamedPipe(
lpszPipeName,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
1024, 1024, 5000, NULL);
Через создаваемый канал передаются сообщения (так как указана константа PIPE_TYPE_MESSAGE). Данная реализация предназначена только для чтения (константа PIPE_READMODE_MESSAGE). При создании канала размер буферов ввода/вывода равны 1024 байт. Время ожидания операций выбрано равным 5 секунд. Атрибуты защиты не указаны.
После того как серверный процесс создал канал, он может перейти в режим соединения с клиентским процессом. Соединение со стороны сервера выполняется с помощью функции ConnectNamedPipe(), синтаксис которой следующий
BOOL ConnectNamedPipe ( HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped )
Параметры:
hNamedPipe - хэндл именованного канала.
lpOverlapped - указатель на структуру OVERLAPPED.
Возвращаемое значение. При успешном выполнении - TRUE, при ошибке - FALSE. В последнем случае для уточнения причины возникновения ошибки можно воспользоваться функцией GetLastError().
Через первый параметр hNamedPipe серверный процесс передает этой функции хэндл канала, полученный от функции CreateNamedPipe().
Если второй параметр lpOverlapped указан как NULL, функция выполняется в синхронном режиме. В противном случае используется асинхронный режим. Структура OVERLAPPED описана в файле winbase.h следующим образом:
typedef struct _OVERLAPPED {
DWORD Internal; //состояние системы
DWORD InternalHigh; //число прочитанных или записанных байтов
DWORD Offset; //младшие разряды смещения в файле
DWORD OffsetHigh; //старшие разряды смещения в файле
HANDLE hEvent; //хэндл объекта, сигнализирующего об окончании операции ввода - вывода.
} OVERLAPPED, *LPOVERLAPPED;
Первое поле, Internal, зарезервировано для внутреннего использования системой. В некоторых случаях оно показывает состояние системы.
Второе поле, InternalHigh, также зарезервировано для использования системой, оно показывает число прочитанных или записанных в файл байтов.
Третье и четвёртое поля работают вместе. В третье поле, Offset, записываются младшие тридцать два разряда смещения в файле, начиная с которого необходимо производить чтение или запись в файл. Четвёртое поле, OffsetHigh, содержит старшие тридцать два разряда этого слова. В случае применения именованных каналов и устройств связи должны быть установлены в 0.
Пятое поле hEvent - хэндл объекта, который сигнализирует об окончании операции ввода/вывода. При асинхронных операциях ввода/вывода программа, начавшая операцию чтения или записи, должна определить факт окончания записи и свои дальнейшие действия производить в зависимости от результата операции. Другими словами, ПРОГРАММА ДОЛЖНА ИМЕТЬ ВОЗМОЖНОСТЬ СИНХРОНИЗАЦИИ СВОЕЙ РАБОТЫ С РАБОТОЙ ОПЕРАЦИИ ВВОДА/ВЫВОДА. hEvent - это хэндл синхронизирующего объекта-события, который до начала операции ввода/вывода должен быть создан при помощи обращения к функции СгеateEvent().
Как только операция ввода/вывода закончится, система устанавливает событие, хэндлом которого является hEvent. Как только он стал ненулевым, система переводит его в незанятое состояние, а затем тут же делает незанятым и хэндл файла.
При асинхронной операции можно дожидаться двух событий:
Событие первое - это окончание операции ввода/вывода. Индикатором наступления этого события является перевод в незанятое состояние объекта-события, хэндл которого равен hEvent.
Событие второе - освобождение хэндла файла. В зависимости от того, какие цели преследует программа, она может реагировать на каждое из этих событий.
В зависимости от различных условий функция ConnectNamedPipe может вести себя по разному.
Для канала, созданного в синхронном блокирующем режиме (с использованием константы PIPE_WAIT), функция ConnectNamedPipe() переходит в состояние ожидания соединения с клиентским процессом.
Если канал создан в синхронном неблокирующем режиме, функция ConnectNamedPipe() немедленно возвращает управление с кодом TRUE, если только клиент был отключен от данной реализации канала и возможно подключение этого клиента. В противном случае возвращается значение FALSE. Дальнейший анализ необходимо выполнять с помощью функции GetLastError(). Эта функция может вернуть значение:
ERROR_PIPE_LISTENING - если к серверу еще не подключен ни один клиент,
ERROR_PIPE_CONNECTED - если клиент уже подключен
ERROR_NO_DATA - если предыдущий клиент отключился от сервера, но клиент еще не завершил соединение.
Пример 2. Добавим к примеру 1 следующую команду
fConnected = ConnectNamedPipe(hNamedPipe, NULL);
В данном случае функция ConnectNamedPipe перейдет в состояние ожидания, так как канал был создан для работы в синхронном блокирующем режиме.
Для создания канала клиентский процесс может воспользоваться функцией CreateFile(). Эта функция предназначена для работы с файлами, однако с ее помощью можно также открыть канал, указав его имя вместо имени файла. Забегая вперед, скажем, что функция CreateFile() позволяет открывать не только файлы или каналы Pipe, но и другие системные ресурсы, например, устройства и каналы Mailslot.
Функция CreateFile() имеет синтаксис функции следующий.
HANDLE CreateFile (LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile )
Параметры:
lpFileName - указатель на строку имени файла (канала).
dwDesiredAccess - режим доступа.
dwShareMode - режим совместного использования файла.
lpSecurityAttributes - указатель на атрибуты защиты
dwCreationDistribution - параметры создания.
dwFlagsAndAttributes - атрибуты файла.
hTemplateFile - хэндл файла с атрибутами.
Возвращаемое значение. При успешном выполнении - хэндл созданной реализации канала, при ошибке - INVALID_HANDLE_VALUE. Код ошибки уточняется при вызове функции GetLastError().
При работе с файлами в первом параметре lpFileName задается адрес строки, содержащей имя файла, который собираются создать или открыть. Строка должна быть закрыта двоичным нулем. Если функция CreateFile() работает с каналом Pipe, параметр lpFileName определяет имя канала.
Второй параметр dwDesiredAccess определяет тип доступа, который должен быть предоставлен к открываемому файлу (каналу). Здесь используя логическую комбинацию следующих констант можно получить:
Константа |
Описание |
|
0 |
Доступ запрещен, однако приложение может определять атрибуты файла, канала или устройства, открываемого при помощи функции CreateFile() |
|
GENERIC_READ |
Разрешен доступ на чтение из файла или канала Pipe |
|
GENERIC_WRITE |
Разрешен доступ на запись в файл или канал Pipe |
Тип доступа, указанный при помощи параметра dwDesiredAccess, не должен противоречить типу доступа для канала, заданного при его создании функцией CreateNamedPipe().
С помощью третьего параметра dwShareMode задаются режимы совместного использования открываемого или создаваемого файла. Для этого параметра также можно указать логическую комбинацию следующих констант:
Константа |
Описание |
|
0 |
Совместное использование файла запрещено |
|
FILE_SHARE_READ |
Другие процессы могут открывать файл с помощью функции CreateFile() для чтения |
|
FILE_SHARE_WRITE |
Другие процессы могут открывать файл с помощью функции CreateFile() на запись |
Через четвертый параметр lpSecurityAttributes необходимо передать указатель на дескриптор защиты или значение NULL, если этот дескриптор не используется.
Пятый параметр dwCreationDistribution определяет действия, выполняемые функцией CreateFile(), если приложение пытается создать файл, который уже существует. Для этого параметра вы можете указать одну из следующих констант:
Константа |
Описание |
|
CREATE_NEW |
Если создаваемый файл уже существует, функция CreateFile() возвращает код ошибки |
|
CREATE_ALWAYS |
Существующий файл перезаписывается, при этом содержимое старого файла теряется |
|
OPEN_EXISTING |
Открывается существующий файл. Если файл с указанным именем не существует, функция CreateFile() возвращает код ошибки |
|
OPEN_ALWAYS |
Если указанный файл существует, он открывается. Если файл не существует, он будет создан |
|
TRUNCATE_EXISTING |
Если файл существует, он открывается, после чего длина файла устанавливается равной нулю. Содержимое старого файла теряется. Если же файл не существует, функция CreateFile() возвращает код ошибки |
Шестой параметр dwFlagsAndAttributes задает атрибуты и флаги для файла. При этом можно использовать любые логические комбинации следующих флагов (кроме флага FILE_ATTRIBUTE_NORMAL, который можно использовать только отдельно):
Атрибут |
Описание |
|
FILE_ATTRIBUTE_ARCHIVE |
Файл был архивирован (выгружен) |
|
FILE_ATTRIBUTE_COMPRESSED |
Файл, имеющий этот атрибут, динамически сжимается при записи и восстанавливается при чтении. Если этот атрибут имеет каталог, то для всех расположенных в нем файлов и каталогов также выполняется динамическое сжатие данных |
|
FILE_ATTRIBUTE_NORMAL |
Остальные перечисленные в этом списка атрибуты не установлены |
|
FILE_ATTRIBUTE_HIDDEN |
Скрытый файл |
|
FILE_ATTRIBUTE_READONLY |
Файл можно только читать |
|
FILE_ATTRIBUTE_SYSTEM |
Файл является частью операционной системы |
В дополнение к перечисленным выше атрибутам, через параметр dwFlagsAndAttributes вы можете передать любую логическую комбинацию флагов, перечисленных ниже:
Флаг |
Описание |
|
FILE_FLAG_WRITE_THROUGH |
Отмена промежуточного кэширования данных для уменьшения вероятности потери данных при аварии |
|
FILE_FLAG_NO_BUFFERING |
Отмена промежуточной буферизации или кэширования. При использовании этого флага необходимо выполнять чтение и запись порциями, кратными размеру сектора (обычно 512 байт) |
|
FILE_FLAG_OVERLAPPED |
Асинхронное выполнение чтения и записи. Во время асинхронного чтения или записи приложение может продолжать обработку данных |
|
FILE_FLAG_RANDOM_ACCESS |
Указывает, что к файлу будет выполняться произвольный доступ. Флаг предназначен для оптимизации кэширования |
|
FILE_FLAG_SEQUENTIAL_SCAN |
Указывает, что к файлу будет выполняться последовательный доступ от начала файла к его концу. Флаг предназначен для оптимизации кэширования |
|
FILE_FLAG_DELETE_ON_CLOSE |
Файл будет удален сразу после того как приложение закроет его идентификатор. Этот флаг удобно использовать для временных файлов |
|
FILE_FLAG_BACKUP_SEMANTICS |
Файл будет использован для выполнения операции выгрузки или восстановления. При этом выполняется проверка прав доступа |
|
FILE_FLAG_POSIX_SEMANTICS |
Доступ к файлу будет выполняться в соответствии со спецификацией POSIX (в частности, в этом случае могут употребляться файлы, имена которых различаются только регистром букв) |
И, наконец, седьмой параметр hTemplateFile предназначен для доступа к файлу шаблона с расширенными атрибутами создаваемого файла.
Пример 3.
Приведем фрагмент исходного текста клиентского приложения, открывающего канал с именем $MyPipe$ при помощи функции CreateFile():
char szPipeName[256];
HANDLE hNamedPipe;
strcpy(szPipeName, "\\\\.\\pipe\\$MyPipe$");
hNamedPipe = CreateFile(
szPipeName, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
Здесь канал открывается как для записи, так и для чтения.
Если сервер работает с несколькими клиентскими процессами, то он может использовать для этого несколько реализаций канала, причем одни и те же реализации могут применяться по очереди.
Установив канал с клиентским процессом при помощи функции ConnectNamedPipe(), серверный процесс может затем разорвать канал, вызвав для этого функцию DisconnectNamedPipe(). После этого реализация канала может быть вновь использована для соединения с другим клиентским процессом.
Синтаксис функции DisconnectNamedPipe() следующий:
BOOL DisconnectNamedPipe ( HANDLE hNamedPipe)
Параметры:
hNamedPipe - хэндл именованного канала, полученный от функции CreateNamedPipe().
Возвращаемое значение. При успешном выполнении - TRUE, при ошибке - FALSE. В последнем случае для уточнения причины возникновения ошибки можно воспользоваться функцией GetLastError().
Если канал больше не нужен, после отключения от клиентского процесса серверный и клиентский процессы должны закрыть его хэндл функцией CloseHandle():
CloseHandle (HANDLE hNamedPipe).
Запись данных в открытый канал выполняется с помощью функции WriteFile(), аналогично записи в обычный файл:
BOOL WriteFile (HANDLE hPipe, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, POVERLAPPED lpOverlapped )
Параметры:
hPipe - хэндл созданной реализации канала.
lpBuffer - указатель на буфер, данные из которого будут записаны в канал.
nNumberOfBytesToWrite - размер буфера для записи.
lpNumberOfBytesWritten - количества байт данных, действительно записанных в канал.
lpOverlapped - указатель на структуру OVERLAPPED
Возвращаемое значение. При успешном выполнении - TRUE, при ошибке - FALSE. В последнем случае для уточнения причины возникновения ошибки можно воспользоваться функцией GetLastError().
Пример 4.
HANDLE hNamedPipe;
DWORD cbWritten;
char szBuf[256];
WriteFile(hNamedPipe,szBuf,strlen(szBuf)+1,&cbWritten,NULL);
Замечание. Если канал был создан для работы в блокирующем режиме, и функция WriteFile() работает синхронно (без использования вывода с перекрытием), то эта функция не вернет управление до тех пор, пока данные не будут записаны в канал.
Как и следовало ожидать, для чтения данных из канала можно воспользоваться функцией ReadFile(), которая считывает данные из файла с позиции, обозначенной указателем файла. После считывания данных указатель файла сдвигается на число считанных байт.
BOOL ReadFile (HANDLE hPipe, LPCVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, POVERLAPPED lpOverlapped)
Параметры:
hPipe - хэндл созданной реализации канала.
lpBuffer - указатель на буфер, данные из которого будут записаны в канал.
nNumberOfBytesToRead - размер буфера для чтения.
lpNumberOfBytesRead - количества байт данных, действительно записанных в канал.
lpOverlapped - указатель на структуру OVERLAPPED
Возвращаемое значение. При успешном выполнении - TRUE, при ошибке - FALSE. В последнем случае для уточнения причины возникновения ошибки можно воспользоваться функцией GetLastError().
Пример 5.
HANDLE hNamedPipe;
DWORD cbRead;
char szBuf[256];
ReadFile(hNamedPipe, szBuf, 512, &cbRead, NULL);
Данные, прочитанные из канала hNamedPipe, будут записаны в буфер szBuf, имеющий размер 512 байт. Количество действительно прочитанных байт данных будет сохранено функцией ReadFile() в переменной cbRead. Так как последний параметр функции указан как NULL, используется синхронный режим работы без перекрытия.
Подобные документы
Рассмотрение способов организации передачи данных между различными процессами, основанных на использовании дейтаграммных каналов Mailslot. Однонаправленный интерфейс взаимодействия между процессами. Создание и открытие канала, запись и чтение сообщений.
контрольная работа [19,1 K], добавлен 10.10.2010Технологии и каналы передачи данных компьютерных сетей. Коаксиальные кабельные каналы. Технические средства коммуникации, сетевое оборудование: сетевые адаптеры, повторители, разветвители, мосты, маршрутизаторы, шлюзы, их функции, типы и преимущества.
реферат [26,2 K], добавлен 10.02.2012Просмотр, запись и чтение данных буфера обмена. Динамический обмен данными (DDE), способы его организации. Атомы в Windows, их понятие и функции. Особенности задания параметра lParam сообщений DDE. Обмен и передача данных между клиентом и сервером.
лекция [303,7 K], добавлен 24.06.2009Последовательный интерфейс для передачи данных. Синхронный и асинхронный режимы передачи данных. Формат асинхронной посылки. Постоянная активность канала связи при синхронном режиме передачи. Реализация последовательного интерфейса на физическом уровне.
реферат [106,9 K], добавлен 28.04.2010Критерии различия между механизмами межпроцессного обмена. Системные вызовы для работы с разделяемой памятью, выделение ее области. Создание и инициализация семафора. Задачи использования потока. Способ обмена между виртуальной машиной Linux и Windows.
лекция [485,2 K], добавлен 29.07.2012Анализ применяемых технологий в мультисервисных сетях. Сосуществование сетей АТМ с традиционными технологиями локальных сетей. Характеристика сети передачи данных РФ "Электросвязь" Кемеровской области. Схема организации сети передачи данных, каналы связи.
дипломная работа [642,3 K], добавлен 02.11.2010Операция обмена данными между прикладной программой и шиной USB путем передачи буферов памяти. Основные характеристики каналов. Аппаратная часть USB. Физическая топология шины. Конструкция кабелей и коннекторов. Способы питания устройств от сети.
контрольная работа [218,4 K], добавлен 27.01.2014Назначение буфера обмена, управление его данными в среде Windows. Взаимодействие между владельцем и клиентом буфера. Данные и тип дескриптора, для каждого типа предопределенных форматов. Воспроизведение данных буфера обмена с задержкой, окна просмотра.
реферат [58,9 K], добавлен 04.10.2010Производительность алгоритмов SPT и FB. Глобальные переменные и константы программы. Компьютерная сеть передачи данных. Каналы передачи данных и средства коммутации. Сетевое программное обеспечение. Распределение ресурсов однопроцессорных серверов.
курсовая работа [135,3 K], добавлен 24.06.2013Анализ средств программирования, используемых для решения задачи. Система управления базами данных Oracle. Средство разработки и администрирования Toad for Oracle. Описание процесса заказа и работы триггера. Применение операционной системы Windows 7.
курсовая работа [532,2 K], добавлен 05.04.2017