Приложение MSLOTS
Исходный текст серверного приложения MSLOTS представлен в листинге2.13.
Листинг 2.13. Файл mailslot/mslots/mslots.c
// ==================================================
// Приложение MSLOTS (серверное приложение)
// Демонстрация использования каналов Mailslot
// для передачи данных между процессами
//
// (С) Фролов А.В., 1996
// Email: frolov@glas.apc.org
// ==================================================
#include <windows.h>
#include <stdio.h>
#include <conio.h>
int main()
{
// Код возврата из функций
BOOL fReturnCode;
// Размер сообщения в байтах
DWORD cbMessages;
// Количество сообщений в канале Mailslot
DWORD cbMsgNumber;
// Идентификатор канала Mailslot
HANDLE hMailslot;
// Имя создаваемого канала Mailslot
LPSTR lpszMailslotName = "\\\\.\\mailslot\\$Channel$";
// Буфер для передачи данных через канал
char szBuf[512];
// Количество байт данных, принятых через канал
DWORD cbRead;
printf("Mailslot server demo\n"
"(C) A. Frolov, 1996, Email: frolov@glas.apc.org\n");
// Создаем канал Mailslot, имеющий имя lpszMailslotName
hMailslot = CreateMailslot(
lpszMailslotName, 0,
MAILSLOT_WAIT_FOREVER, NULL);
// Если возникла ошибка, выводим ее код и зваершаем
// работу приложения
if(hMailslot == INVALID_HANDLE_VALUE)
{
fprintf(stdout,"CreateMailslot: Error %ld\n",
GetLastError());
getch();
return 0;
}
// Выводим сообщение о создании канала
fprintf(stdout,"Mailslot created\n");
// Цикл получения команд через канал
while(1)
{
// Определяем состояние канала Mailslot
fReturnCode = GetMailslotInfo(
hMailslot, NULL, &cbMessages,
&cbMsgNumber, NULL);
if(!fReturnCode)
{
fprintf(stdout,"GetMailslotInfo: Error %ld\n",
GetLastError());
getch();
break;
}
// Если в канале есть Mailslot сообщения,
// читаем первое из них и выводим на экран
if(cbMsgNumber != 0)
{
if(ReadFile(hMailslot, szBuf, 512, &cbRead, NULL))
{
// Выводим принятую строку на консоль
printf("Received: <%s>\n", szBuf);
// Если пришла команда "exit",
// завершаем работу приложения
if(!strcmp(szBuf, "exit"))
break;
}
else
{
fprintf(stdout,"ReadFile: Error %ld\n",
GetLastError());
getch();
break;
}
}
// Выполняем задержку на 500 миллисекунд
Sleep(500);
}
// Перед завершением приложения закрываем
// идентификатор канала Mailslot
CloseHandle(hMailslot);
return 0;
}
Прежде всего, серверное приложение создает канал Mailslot, пользуясь для этого функцией CreateMailslot:
hMailslot = CreateMailslot(lpszMailslotName, 0,
MAILSLOT_WAIT_FOREVER, NULL);
Далее запускается цикл, в котором после определения состояния канала выполняется чтение сообщений из него (при условии, что в канале есть сообщения). Для проверки состояния канала мы используем функцию GetMailslotInfo.
Сообщение читается функцией ReadFile:
ReadFile(hMailslot, szBuf, 512, &cbRead, NULL);
После чтения перед выполнением очередной проверки состояния приложение выполняет задержку, вызывая для этого функцию Sleep:
Sleep(500);
Задержка необходима для того, чтобы ожидание сообщения в цикле не отнимало слишком много системных ресурсов у других приложений.
Перед завершением работы приложения мы закрываем идентификатор канала Mailslot с помощью функции CloseHandle:
CloseHandle(hMailslot);