Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Наблюдение за сообщениями в именованном канале



Кроме чтения именованного канала с помощью ReadFile, можно также опреде­лять, присутствует ли в нем сообщение, которое можно считать. Для этого служит функция PeekNamedPipe. BOOL PeekNamedPipe (HANDLE hPipe, LPVOID lpvBuffer,

DWORD cbBuffer, LPDWQRD lpcbRead, LPDWORD lpcbAvail,

LPDWORD lpcbMessage)

Функция PeekNamedPipe читает все байты или сообщения в канале, не разрушая их; она не блокируется и завершается немедленно.

Чтобы узнать, есть ли данные в канале, проверьте значение *lpcbAvail; если есть, *lpcbAvail будет больше нуля. В этом случае lpvBuffer и lpcbRead могут иметь значение NULL. Если буфер задан параметрами lpvBuffer и cbBuffer, то *lpcbMessage сообщает, есть ли оставшиеся байты сообщения, которые не вписыва­ются в буфер, что позволяет выделить большой буфер перед чтением из именованного канала. В байтовом режиме канала это значение нулевое.

Еще раз подчеркнем, что PeekNamedPipe не уничтожает сообщения, так что для удаления сообщений или байтов из канала нужен дополнительный вызов ReadFile.

Безопасность именованного канала

Ниже приведены важные права безопасности для именованных каналов.

• GENERIC_READ.

• GENERIC_WRITE.

• SYNCHRONIZE (разрешает ожидание потока).

Соответствующие права устанавливаются в зависимости от режима доступа (дуплексный, входящий или исходящий). Для всех трех режимов требуется право SYNCHRONIZE.

Почтовые ячейки

Почтовая ячейка Win32 имеет имя. Почтовые ячейки пред­ставляют собой широковещательный механизм и ведут себя иначе, чем именованные каналы, что делает их полезными в некоторых весьма важных, но довольно редких си­туациях. Ниже приведены основные характеристики почтовых ячеек.

• Почтовая ячейка является однонаправленной.

• Почтовая ячейка может иметь несколько отправителей и несколько получателей,
но чаще встречается форма с одним отправителем и несколькими получателями
или наоборот.

• Отправитель, или клиент, не знает наверняка, получили ли на самом деле сообщение все, некоторые либо хотя бы один получатель, или сервер.

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

• Длина сообщения ограниченна.

Для использования почтовой ячейки нужно выполнить ряд операций.

• Каждый сервер (получатель) создает дескриптор почтовой ячейки, используя CreateMailslot.

• Сервер ожидает приема сообщения из почтовой ячейки, вызвав ReadFile.

• Клиент, не обладающий возможностью чтения, должен открывать почтовую
ячейку функцией CreateFile и посылать сообщения с помощью WriteFile.
Операция открытия завершится неудачно (имя не будет найдено), если ожидающих получателей нет.

Сообщение клиента может читаться всеми серверами; все они получают одно и то же сообщение.

Существует еще одна возможность. Клиент, вызывая CreateFile, может указать имя почтовой ячейки в форме: \\*\maiIslot\имя_почтовой_ячейки

Таким образом, символ * играет роль подстановочного знака, и клиент может най­ти каждый сервер в домене имен — объединенной в сеть группе систем, которой сете­вой администратор присвоил общее имя.





Дата публикования: 2015-11-01; Прочитано: 266 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...