Mailslot[Путь]ИмяПочтовогоЯщика

В последних двух случаях размер сообщений ограничивается 400 байтами.

Запись и чтение данных в почтовых ящиках осуществляется аналогично записи и чтению в каналах.

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

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

 

Пример. Передача данных от программы-клиента программе-серверу с помощью почтового ящика на одной рабочей станции.

 

Программа-сервер

 

#include <windows.h>

#include <stdio.h>

#include <conio.h>

BOOL fReturnCode; // Код возврата из функций

DWORD cbMessages; // Размер сообщения в байтах

DWORD cbMsgNumber; // Количество сообщений в Mailslot

HANDLE hMailslot; // Идентификатор Mailslot

LPSTR lpszMailslotName = "\\.\mailslot\$MyFirstMailslot"; // Имя Mailslot

char szBuf[512]; // Буфер для передачи данных через Mailslot

DWORD cbRead; // Количество байт данных, принятых через Mailslot

 

int main()

{

// Создаем Mailslot, с именем lpszMailslotName

hMailslot = CreateMailslot(lpszMailslotName, 0,

MAILSLOT_WAIT_FOREVER, NULL);

// Если возникла ошибка, завершаем работу приложения

if(hMailslot == INVALID_HANDLE_VALUE)

{

printf("Error MailSlot Creating!!!n");

getch();

return 0;

}

while (1)

{

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

fReturnCode = GetMailslotInfo(hMailslot, NULL,

&cbMessages, &cbMsgNumber, NULL);

if(!fReturnCode)

{

printf("Get MailSlotInfo Error!!!n");

getch();

return 0;

}

// Если в Mailslot есть сообщения, читаем первое и выводим на экран

if(cbMsgNumber != 0)

{

if(ReadFile(hMailslot, szBuf, 512, &cbRead, NULL))

printf("Received %d bytes: <%s>n", cbRead, szBuf);

else printf("Error Data Transfer!!!n");

break;

}

}

getch();

CloseHandle(hMailslot);

return 0;

}

 

Программа-клиент

 

#include <windows.h>

#include <stdio.h>

#include <conio.h>

HANDLE hMailslot; // Идентификатор Mailslot

char szMailslotName[256]; // Буфер для имени Mailslot

char szBuf[512]; // Буфер для передачи данных через Mailslot

DWORD cbWritten; // Количество байт, переданных через Mailslot

LPSTR lpszMailslotName = "\\.\mailslot\$MyFirstMailslot"; // Имя Mailslot

 

int main()

{

// Создаем Mailslot

hMailslot = CreateFile(

lpszMailslotName, GENERIC_WRITE,

FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

// Если возникла ошибка, завершаем работу приложения

if(hMailslot == INVALID_HANDLE_VALUE)

{

printf("CreateFile Error!!!n");

getch();

return 0;

}

// Посылка данных через Mailslot

strcpy(szBuf,"Test MailSlot Connection");

if(!WriteFile(hMailslot, szBuf, strlen(szBuf) + 1, &cbWritten, NULL))

// Если произошла ошибка, выдаем сообщение

printf("Error Data Transfer!!!n");

else printf("Transferred %d bytes: <%s>n", cbWritten, szBuf);

CloseHandle(hMailslot);

getch();

return 0;

}