стороне сервера, который должен отправить почтовый ящик клиенту, производится запись и закрытие почтового ящика.
На стороне клиента постоянно открыт почтовый ящик.
Передача происходит только в одну сторону и она ненадежна и не управляема.
Рассмотрим дуплексную передачу данных.
Для дуплексную передачи данных архитектура выглядит следующим образом:
Дуплексная передача данных полностью дублирует симплексную передачу в другую сторону, т.е. передача происходит в две стороны.
“+”:
- работают на любых версиях Windows
“-”:
- не гарантируемая передача
- ограниченный размер передаваемого сообщения
Система имён.
Для создания почтовых слотов используются имена. При создании имя должно быть задано в следующей форме.
\\имя компьютера\mailslot\имя_почт_ящика
В качестве имени компьютера могут использоваться служебные символы:
. – локальный компьютер, передача в внутри одного компьютера.
* - все компьютеры внутри сегмента компьютера отправителя.
имя рабочей группы или домена – передача выполняется всеми рабочими группами или доменами.
собственно имя компьютера – передача осуществляется указанным компьютером.
Имя почт_ящика может быть любое.
Пример:
\\*\mailslot\messngк
\\.\mailslot\my_first_slot
\\CAT\mailslot\messngz
\\CAT-10\mailslot\messngz
Обратите внимание на то, что только локально можно создавать почтовый слот. А вот использоваться можно любые почтовые слоты. Форма имени при открытии почтового слота.
\\ComputerName\mailslot\имя_почт_ящика
или
\\DomainName\mailslot\имя_почт_ящика
Создание почтового ящика.
Зададим имя:
LPSTR nameSlot = “ \\\\ .\\ mailslot \\ my_slot ”;
Создание:
hSlot = CreateMailSlot (nameSlot, 0, MAILSLOT_WAIT_FOREVER, NULL );
// проверка ошибки создания:
if (hSlot = = INVALID_HANDLE_VALUE)
return FALSE;
Функция CreateMailSlot – создание почтового ящика, возвращает handle почтового ящика, по которому мы будем читать и закрывать почтовый ящик.
Параметры функции CreateMailSlot:
nameSlot – имя почтового ящика, обязательно;
0 – максимальный размер сообщения;
MAILSLOT_WAIT_FOREVER – режим ожидания;
NULL – атрибут безопасности.
После создания почтовый ящик готов принимать данные. Создание почтового ящика производится только на стороне приёмника, т.е. имя почтового ящика должно быть локальным.
Чтение данных с почтового ящика.
while (TRUE)
{ UINT bytes = ReadFile(hSlot, rzBuf, sizeof(rzBuf)-1, &rzcbBuf, NULL);
// обработка данных:
}
Функция Read File- чтение почтового ящика.
Параметры функции ReadFile:
hSlot – hendle почтового ящика;
rzBuf – буфер, куда будем записывать;
sizeof(rzBuf)-1 – размер буфера;
&rzcbBuf – адрес счетчика буфера.
В одном почтовом ящике может быть несколько сообщений о других компьютерах, эти сообщения разделяются двумя нулями.
// проверка ошибки чтения:
if (!bytes) return;
Close Handle(nSlote); //закрытие почтового ящика
При какой либо ошибки функция ReadFile возвращает нулевое значение и прекращает выполнение цикла.
Записьвпочтовыйящик.
LPSTR nameSlot = “ \\\\ CAT-10 \\ mailslot \\ my_slot ”;
// создание файла на другом компьютере:
HANDLE hSlot = CreateFile(nameSlot,
GENERIC_WRITE, // режим записи
FILE_SHARE_REHD, // файл с разделенным чтением
NULL, // атрибут защиты
OPEN_EXISTING, // открытие нового файла
FILE_ATTRIBUTE_NORMAL, // секьюрети параметры
NULL); // перекрываемый ввод/вывод
// Если параметры не верны, то функция вернёт ошибку
// функция записи в файл:
WriteFile(hSlot, cBuff, dwLength+1, &dwScratht, NULL);
//После выполнения этой функции наша информация находится на сервере
CloseHandle(hSlot);
Для работы с почтовыми ящиками определены две информационные две функции:
GetMailslotInfo – функция, которая позволяет, получить количество сообщений внутри почтового ящика, размер текущего сообщения, режим работы почтового ящика и т.д.
SetMailslotInfo – функция, которая может, изменять тайм аут.
Функция GetMailslotInfo получает информацию определенного mailslot.
BOOLGetMailslotInfo (
HANDLE hMailslot, // маркер (дескриптор) указатель на слот
LPDWORD lpMaxMessageSize, // адрес максимального размера сообщения
LPDWORD lpNextSize, // адрес размера следующего сообщения
LPDWORD lpMessageCount, // адрес числа сообщений
LPDWORD lpReadTimeout // адрес блокировки времени чтения
);
hMailslot
Маркер (дескриптор) к mailslot. Функция CreateMailslot должна создать этот маркер(дескриптор).
lpMaxMessageSize
Указатель на переменную максимального размера сообщения (в байтах), позволенных для этого mailslot. Это значение может быть большее или равняться значению, определенному в параметре cbMaxMsg функции CreateMailslot, которая создала mailslot. Этот параметр может быть НУЛЕВОЙ (ПУСТОЙ).
lpNextSize
Указатель на переменную размера (в байтах), следующего сообщения, когда функциональные возвраты. Следующее значение имеет специальное значение:
MAILSLOT_NO_MESSAGE следующего сообщения нет.
Этот параметр может быть НУЛЕВОЙ (ПУСТОЙ).
lpMessageCount
Указатель на переменную общего количества сообщений, ожидающих чтения. Этот параметр может быть НУЛЕВОЙ (ПУСТОЙ).
LpReadTimeout
Указатель на переменную количества времени (в миллисекундах) которое операция чтения ожидает сообщение. Этот параметр может быть НУЛЕВОЙ (ПУСТОЙ).
Значения возврата
Если функция выполнена успешно, возвращаемое значение отлично от нуля.
Если произошли сбои, возвращаемое значение нулевое. Чтобы получить расширенную информацию об ошибке используется функция GetLastError.
ФункциюGetMailslotInfo можно применить для того, чтобы обнаружить что находится в слоте.
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
void main()
{
HANDLE hsl=NULL;
hsl= CreateMailslot("\\\\.\\mailslot\\he",0,5,NULL);
if (hsl!=INVALID_HANDLE_VALUE)
{
cout << "Ok Created mailslot" << endl;
char buffer[255];
DWORD nBytesRead;
while (true)
{
DWORD dwmes=0;
if (GetMailslotInfo(hsl,NULL,NULL,&dwmes,NULL)!=0)
{
if (dwmes>0)
{
if (ReadFile(hsl, &buffer, 255, &nBytesRead, NULL)!=0)
{
cout << "Ok read" << endl;
cout << buffer << endl;
int i;
cin >> i;
return;
}
}
}
cout << "time aut" << endl;
}
}
}
Индивидуальные задания:
Передать текстовый файл между двумя компьютерами.
Передать двоичный файл между двумя компьютерами.
Во время набора текста в одной программе одновременно выводить текст в окне другой программы сетевого компьютера.
При перемещении окна выводить в другой программе другого компьютера
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.