Технический проект
Общая структура системы
Программа отправки и получения текстовых сообщений в локальной сети.
Используя почтовые слоты (mailslots) и функции NetBIOS, данная программа полностью совместима с такими стандартными утилитами как WinPopup, net send. Добавлен ряд полезных новшеств, функций и возможностей, такие как история сообщений, быстрые ответы, поддержка большинства ОС Microsoft, быстрый список, поддержка сетевых групп.
Почтовый слот (mailslot)
Почтовые слоты – это механизм односторонней пересылки данных между процессами по сети. Почтовые слоты могут использоваться для циркулярной рассылки сообщений целой группе компьютеров одного домена, однако, с другой стороны, нет никакой гарантии доставки посланных данных по нужному адресу, а также не предусмотрено извещение отправителя об их получении.
Любой процесс, который создаёт почтовый слот для приёма данных, называется сервером слота. Даже если само по себе приложение является клиентом и получает данные от приложения-сервера, по отношению к созданному почтовому слоту оно представляет собой сервер. Для данного слота любой компьютер может быть сервером, но читать из слота данные (или обращаться к нему другим способом, например, через наследование) может только процесс, который его создал.
Всякий процесс, которому известно имя слота, может посылать ему данные. Процессы, которые посылают данные на почтовый слот, называются клиентами слота.
Рассмотрим структуру построения почтового слота, а также процедуры, используемые при написании данного дипломного проекта, и опишем их.
Создание почтового слота.
Для создания слота в приложении используется функция CreateMailSlot():
HANDLE CreateMailslot (
LPCTSTR lpName,
DWORD nMaxMessageSize,
DWORD lReadTimeout,
LPSECURITY_ATTRIBUTES lpSecurityAttributes);
Первый параметр – это указатель на ASCII‑строку, содержащую имя создаваемого почтового слота. Слоты создаются только на локальном компьютере, поэтому полное имя слота выглядит следующим образом:
\\.\mailslot\[путь] имя
В именах почтовых слотов поддерживается псевдокаталоговая структура. Для лучшей организации почтовых слотов в их именах можно указывать пути в каталогах.
Функция CreateMailSlot также принимает в качестве параметров максимальный размер сообщений, время задержки для операций чтения и необязательную защитную структуру. Вместо значения задержки можно указать MAILSLOT_WAIT_FOREVER для блокирования операций чтения на слоте до получения сообщения без ограничения времени.
Если функция CreateMailSlot() завершается успешно, она возвращает ключ для нового слота. В случае ошибки возвращается значение INVALID_HANDLE_VALUE, для получения кода ошибки можно воспользоваться функцией GetLastError().
Создание типичного почтового слота может быть реализовано следующим образом:
Hslot: = CreateMailSlot(«\\\\.\mailslot\\MySlot\MsgSlot»,
300,
MAILSLOT_WAIT_FOREVER,
NULL);
If hSlot=INVALID_HANDLE_VALUE then
Begin
ShowMessage (‘CreateMailSlot Error’, GetLastError());
Halt(0);
End;
Для изменения времени задержки операций чтения после создания слота используется функция SetMailSlot(). Кроме того, для получения такой информации о слоте, как максимальный размер сообщения, размер следующего сообщения в очереди и количество сообщений в очереди, можно использовать функцию GetMailSlotInfo().
Чтение из почтового слота
Для чтения из слота используется функция ReadFile(), которая завершает свою работу после получения сообщения, независимо от того, сколько байт необходимо прочитать.
Кроме того, с помощью функции GetMailSlotInfo() можно узнать количество сообщений, ожидающих в очереди слота, и размер следующего сообщения.
Запись в почтовый слот
Для записи сообщения в слот необходимо сначала открыть его ключ с помощью функции CreateFile(), а затем воспользоваться функцией WriteFile() для посылки сообщения. Ключ слота закрывается функцией CloseHandle().
При вызове CreateFile() необходимо указать имя слота, которому посылается сообщение. Указанное имя допускает циркулярную рассылку данных всем слотам с такими же именами на компьютерах домена.
Для локального компьютера имя слота выглядит следующим образом:
\\.\mailslot\[путь] имя
Для удалённого компьютера имя слота имеет следующий вид:
\\имя_удалённого_компьютера\mailslot\[путь] имя
Для рассылки сообщений всем слотам с одинаковыми именами на компьютерах домена необходимо указать следующее имя:
\\имя_домена\mailslot\[путь] имя
Для рассылки всем компьютерам в домене более высокого иерархического уровня используется следующее имя:
\\*\mailslot\[путь] имя
Кроме того, при вызове функции CreateFile() можно выбрать режим GENERIC_WRITE, режим совместного использования FILE_SHARE_READ или режим создания OPEN_EXISTING.
После успешного завершения функции CreateFile() ключ, который она возвращает, можно использовать в функции WriteFile() для посылки сообщений на слот.
Закрытие слота.
По окончании работы с почтовым слотом кго необходимо закрыть вызовом функции CloseHandle() для освобождения ассоциированных с ним системных ресурсов. По завершении процесса все ключи слотов, ассоциированные с процессом, закрываются автоматически. После их закрытия почтовый слот уничтожается, а все данные в его буфере теряются.
Достарыңызбен бөлісу: |