Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
prakt-Storozhok.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
7.98 Mб
Скачать

1.3 Пример создания сервера почтовых ящиков

VAR

Mailslot:THANDLE;

buffer:Array[1..80] of char;

NumberOfBytesRead:DWORD;

ret:Boolean;

begin

// Создание mailslot

Mailslot:=CreateMailslot('\\.\Mailslot\Myslot',0,

MAILSLOT_WAIT_FOREVER, nil);

if MailSlot= INVALID_HANDLE_VALUE then

begin

ShowMessageFmt('Ошибка создания mailslot %d ', [GetLastError]);

exit; end;

// Чтение данных mailslot (блокирующий вызов)

ret:=ReadFile(Mailslot, buffer, 256, NumberOfBytesRead,Nil);

If ret=True then

begin

buffer[NumberOfBytesRead]:=#0;

ShowMessage(buffer);

end

else

begin

ShowMessageFmt('Ошибка %d при чтении из mailslot', [GetLastError]);

exit; end;

end;

1.4. Клиент почтовых ящиков

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

1) Открыть описатель-ссылку на почтовый ящик, в который нужно от­ править данные, с помощью API-функции CreateFile.

2) Записать данные в почтовый ящик, вызвав API-функцию WriteFile. 5) Закрыть описатель почтового ящика с помощью API-функции

CloseHandle.

Клиенты почтовых ящиков соединяются с серверами без установления соединения. Когда клиент открывает описатель-ссылку на почтовый ящик, он не устанавливает связь с сервером почтового ящика. На почтовые ящи­ки ссылаются путем вызова API-функции CreateFile, определенной сле­дующим образом:

function CreateFile(

pFileName: PChar;

dwDesiredAccess,

dwShareMode: DWORD;

IpSecurityAttributes: PSecurityAttributes;

dwCreationDisposition, dwFlagsAndAttributes: WORD;

hTemplateFile: THandle

): THandle; stdcall;.

Параметр lpFileName описывает один или несколько почтовых ящиков, в которые помещаются данные. Правила именования почтовых ящиков таковы:

\\.\mailslot\uмя - определяет локальный почтовый ящик на том же ком­пьютере;

\\имя cepвеpa\mailslot\имя - определяет удаленный сервер почтового ящика с именем имя_сервера;

\\имя домена\mailslot\имя - определяет все почтовые ящики с именем имя в домене имя_домена;

\\*\mailslot\имя - определяет все почтовые ящики с именем имя в ос­новном домене системы.

Параметр dwDesiredAccess должен иметь значение GENERIC_WRITE, потому что клиент может только записывать данные на сервер.

Параметр dwShareMode обязан иметь значение FILE_SHARE_READ, позволяя серверу открывать и выполнять операции чтения из почтового ящика.

Значение параметра lpSecurityAttributes не влияет на почтовые ящики - следует задать Nil.

Флаг dwCreationDisposition должен быть равен OPEN_EXISTING. Это удобно, когда клиент и сервер функционируют на одном и том же компь­ютере. Если сервер не создал почтовый ящик, API-функция CreateFile вернет ошибку.

Параметр dwCreationDisposition не имеет значения, если сервер работа­ет удаленно.

Параметр dwFlagsAndAttributes должен иметь значение FILE_ATTRIBUTE_NORMAL a hTemplateFile – значением Nil.

После успешного создания описателя можно помещать данные в поч­товый ящик. Помните, что клиент может только записывать данные в поч­товый ящик с помощью Win32-функции WriteFile:

function WriteFile(

hFile: THandle;

const Buffer;

nNumberOfBytesToWrite: DWORD;

var lpNumberOfBytesWritten: DWORD;

lpOverlapped: POverlapped

): BOOL; stdcall;.

Параметр hFile - это описатель-ссылка, возвращаемый функцией CreateFile.

Параметры lpBuffer и nNumberOfBytesToWrite определяют, сколько байт будет отправлено от клиента серверу. Максимальный размер сообщения 64 кб. Если клиент попытается отправить сообщение большего размера, функция WriteFile вернет ошибку ERROR_BAD_NETPATH (чтобы узнать код ошибки, вызовите функцию GetLastError).

Параметр lpNumberOfBytesWritten возвращает количество байт, от­правленных серверу после завершения функции WriteFile.

Параметр lpOverlapped позволяет записывать данные в почтовый ящик асинхронно. Поскольку почтовые ящики обмениваются данными без установления соединения, функция WriteFile не блокирует ввод-вывод. На клиенте этот параметр должен быть равен Nil.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]