Контрольная работа: Почтовые каналы передачи данных Mailslot

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

Чтение сообщений из канала Mailslot

Серверный процесс может читать сообщения из созданного им канала Mailslot при помощи функции ReadFile(), как это показано ниже:

HANDLE hMailslot char szBuf[512]; DWORD cbRead;

ReadFile (hMailslotszBuf, 512, &cbRead, NULL);


Через первый параметр функции ReadFile передается хэндл созданного ранее канала Mailslot, полученный от функции CreateMailslot(). Второй и третий параметры задают, соответственно, адрес буфера для сообщения и его размер.

Заметим, что перед выполнением операции чтения следует проверить состояние канала Mailslot.

Если в нем нет сообщений, то функцию ReadFile()вызывать не следует. Для проверки состояния канала вы должны воспользоваться функцией GetMailslotInfo().

Определение состояния канала Mailslot

Серверный процесс может по его хэндлу с помощью функции GetMailslotInfo(), синтаксис которой следующий

BOOL GetMailslotInfo (HANDLE hMailslot, LPDWORD lpMaxMessageSize, LPDWORD lpNextSize, LPDWORD lpMessageCount, LPDWORD lpReadTimeout)

Параметры:

hMailslot –хэндл канала Mailslot.

lpMaxMessageSize – адрес максимального размера сообщения.

lpNextSize – адрес размера следующего сообщения.

lpMessageCount – адрес количества сообщений.

lpReadTimeout – адрес времени ожидания.

Возвращаемое значение. При успешном выполнении – TRUE, при ошибке - FALSE.

Через параметр hMailslot функции передается идентификатор канала Mailslot, состояние которого необходимо определить.

Остальные параметры задаются как указатели на переменные типа DWORD, в которые будут записаны параметры состояния канала Mailslot.

В переменную, адрес которой передается через параметр lpMaxMessageSize, после возвращения из функции GetMailslotInfo() будет записан максимальный размер сообщения.

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

В переменную, адрес которой указан через параметр lpNextSize, записывается размер следующего сообщения, если оно есть в канале. Если же в канале больше нет сообщений, в эту переменную будет записана константа MAILSLOT_NO_MESSAGE

С помощью параметра lpMessageCount можно определить количество сообщений, записанных в канал клиентскими процессами.

Если это количество равно нулю, то не следует вызывать функцию ReadFile()для чтения несуществующего сообщения.

И, наконец, в переменную, адрес которой задается в параметре lpReadTimeout, записывается текущее время ожидания, установленное для канала (в миллисекундах).

Если не нужна вся информация, которую можно получить с помощью функции GetMailslotInfo(), некоторые из ее параметров (кроме, разумеется, первого) можно указать как NULL.

Пример 2. Демонстрация использования функции GetMailslotInfo():

BOOL fReturnCode; DWORD cbMessages;DWORD cbMsgNumber;

fReturnCode = GetMailslotInfo(hMailslot, NULL, &cbMessages, &cbMsgNumber, NULL);


Изменение состояния канала Mailslot

С помощью функции SetMailslotInfo() серверный процесс может изменить время ожидания для канала Mailslot уже после его создания.

К-во Просмотров: 160
Бесплатно скачать Контрольная работа: Почтовые каналы передачи данных Mailslot