Рефераты
 

Разработка программы приема и передачи сообщений в локальной сети Microsoft

Разработка программы приема и передачи сообщений в локальной сети Microsoft

1

122

Разработка программы передачи и приёма сообщений в локальной сети Microsoft

На сегодняшний день существует довольно большое число программ отправки и принятия сообщений для локальных сетей под управлением на платформах от компаний Microsoft, таких как семейство Windows 9x (95, 98, ME, XP) и Windows NT4, Windows2000, разнообразных как по алгоритмам, так и по используемым протоколам. Основной задачей, на которую следует ориентироваться при выборе подобных программ, является величина бюджета, и как следствие, расходы на дополнительную закупку оргтехники (серверы, дополнительные сети, концентраторы).

Поэтому такие программы разделяются на 2 типа:

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

Программы для одноранговых сетей, не требующие выделенного сервера.

К первым средствам передачи сообщений можно отнести такие программы, как Microsoft Messenger, AOL ICQ, различные чаты и телеконференции.

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

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

Целью настоящего проекта явилось создание многофункциональной программы получения и отправки сообщений по локальной сети. Программа разрабатывалась в локальной сети общежития МИЭТ (SWAMP), насчитывающей 400 компьютеров на сегодняшний момент. В процессе создания использовались менее функциональные, но аналогичные по разработке программы Winpopup и Traypopup.

Эскизный проект

Описание протоколов, используемых при написании дипломной работы

Стремительное развитие электронной техники и локальных сетей обусловило необходимость создания современного программного обеспечения, и как следствие, необходимость разработки быстрых и удобных в использовании средств обмена информации, в частности, протоколов.

Протоколы представляют собой набор условий (правил), которые регламентируют формат и процедуры обмена информацией между двумя или несколькими независимыми устройствами или процессами. Протокол имеет три важнейших элемента: синтаксис, семантику и синхронизацию (timing). Синтаксис протокола определяет поля, например, может быть 16-байтовое поле для адресов, 32-байтовое поле для контрольных сумм и 512 байт на пакет. Семантика протокола придает этим полям значение: например, если адресное поле состоит из всех адресов, это «широковещательный» пакет. Синхронизация - количество битов в секунду - это скорость передачи данных. Она важна не только на самых низких уровнях протокола, но и на высших.

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

Встроенные основные протоколы Windows:

Network Basic Input/Output System (NetBIOS)

NetBIOS Extended User Interface (NetBEUI)

Transmission Control Protocol (TCP/IP)

NWLink Internetwork Packet Exchange/Sequenced packet Exchange (IPX/SPX)

Теперь рассмотрим каждый из них.

NetBIOS

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

NetBEUI

NetBEUI - простой транспортный протокол сетевого уровня, предназначенный для поддержки сетей NetBIOS. Как и NetBIOS, NETBEUI не предназначен для маршрутизации, так что он тоже не может использоваться в большой сети. Преимущества NetBEUI - это его скорость и защищённость от ошибок, простота применения и небольшие требования к ресурсам. К недостаткам можно отнести отсутствие средств маршрутизации. Почти полное отсутствие поддержки платформенно-независимых операций и слишком малое количество средств для поиска неполадок.

NetBEUI можно использовать только в небольшой сети. К примеру, в локальной сети общежития МИЭТ, где используются средства маршрутизации, применение данного протокола является нецелесообразным.

TCP/IP

Протокол TCP/IP на сегодняшний день чаще всего используется для работы в сети. Именно этому протоколу Интернет обязан своим быстрым ростом. TCP/IP - самый гибкий транспортный протокол, позволяющий охватывать большие сетевые пространства. Кроме того, он предоставляет возможности для поддержки платформенно-независимых приложений, маршрутизации, а также поддерживает протоколы SNMP, DHCP, службы WINS и DNS.

TCP/IP может быть использован в любой сети, но не рекомендуется для маленьких сетей из-за своих требований к ресурсам. С его помощью можно организовывать большие многоранговые сети.

NWLink (IPX/SPX)

NWLink - это реализация фирмой Microsoft набора протоколов IPX/SPX, используемых фирмой Novell в сетях NetWare. Этот протокол включен в NT для возможности общения с серверами NetWare. С помощью этого протокола клиенты сетей Microsoft могут пользоваться ресурсами серверов Netware и наоборот

Операционные системы семейства Windows используют NWLink для работы с клиентами и серверами NetWare. Кроме того, клиентам и серверам NetWare требуется служба File And Printer Sevice For NetWare для работы с файлами и принтерами семейства Windows.

NWLink используется в сетях, в которых находятся серверы NetWare, или там, где требуются средства маршрутизации, но не хватает ресурсов для использования протокола TCP/IP.

Рис. 1.1. Пример настройки сетевого окружения OC семейства Windows

Обзор аналогичных программ принятия и отправки сообщений

Наиболее используемыми на сегодняшний момент явлются две следующие программы, не требующие больших системных ресурсов.

Winpopup.

Входит в стандартную поставку Windows. В отличие от Winpopup, в программе, представленной в данной дипломной работе, окна отправки и принятия сообщений являются независимыми, что очень удобно для быстрых переговоров: в окне отправки сообщения пишется текст, а получение сообщений происходит в другом окне и между данными окнами можно свободно переключаться. В программе Winpopup такой независимости нет, поэтому для просмотра входящего сообщения приходится отменять отправления своего текста получателю, что является очень неудобной особенностью стандартного средства отправки и приёма сообщений Windows 9x. Что примечательно, в стандартной поставке Windows NT нет аналога Winpopup, поэтому данная программа может являться хорошим сервисом для локальных сетей, состоящих из компьютеров этой операционной системы.

Traypopup.

Основное преимущество этой программы перед прародителем (как и основное отличие) состоит в том, что в окошке посылки сообщения есть кнопка Select, которая показывает список всех компьютеров, присутствующих в сети. Это удобно, потому что не нужно вспоминать имя пользователя в том виде, как оно записано в настройках сети. Также при вызове программы в окне редактирования адреса получателя выставляется имя получателя предыдущего сообщения.

Второе отличие от стандартной программы - она не сидит в Панели Задач, а прячется в третьей, к часам, что экономит место, с одной стороны, но неопытному пользователю будет сложно отыскать её среди иконок других программ, с другой стороны. Из недостатков - часто «вылетает» при приёме сообщения, а также не может справиться с количеством сообщений, больших 30.

Другие аналогичные программы не рассматриваются в связи их громоздкостью и большими требованиями к ресурсам.

Технический проект

Общая структура системы

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

Используя почтовые слоты (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() для освобождения ассоциированных с ним системных ресурсов. По завершении процесса все ключи слотов, ассоциированные с процессом, закрываются автоматически. После их закрытия почтовый слот уничтожается, а все данные в его буфере теряются.

Протокол NetBIOS и его команды

При написании программы с использованием протокола NetBIOS используется блок управления сетью - Net Control Block (NCB). В таблице 1 проиллюстрирована структура NCB, длина и значение каждого поля. Все поля блока NCB перенесены в WinAPI, соответственно, программирование на Delphi с использованием команд NetBIOS является достаточно тривиальной задачей.

Визуальные компоненты Delphi, используемые при разработке данного дипломного проекта.

TMainMenu позволяет поместить главное меню в программу. При помещении TMainMenu на форму это выглядит, как просто иконка. Иконки данного типа называют «невидимыми компонентом», поскольку они невидимы во время выполнения программы. Создание меню включает три шага: (1) помещение TMainMenu на форму, (2) вызов Дизайнера Меню через свойство Items в Инспекторе Объектов, (3) определение пунктов меню в Дизайнере Меню.

TPopupMenu позволяет создавать всплывающие меню. Этот тип меню появляется по щелчку правой кнопки мыши на объекте, к которому привязано данное меню. У всех видимых объектов имеется свойство PopupMenu, где и указывается нужное меню. Создается PopupMenu аналогично главному меню.

TLabel служит для отображения текста на экране. Вы можете изменить шрифт и цвет метки, если дважды щелкнете на свойство Font в Инспекторе Объектов. Видно, что это легко сделать и во время выполнения программы, написав всего одну строчку кода.

TEdit - стандартный управляющий элемент Windows для ввода. Он может быть использован для отображения короткого фрагмента текста и позволяет пользователю вводить текст во время выполнения программы.

TMemo - иная форма TEdit. Подразумевает работу с большими текстами. TMemo может переносить слова, сохранять в ClipBoard фрагменты текста и восстанавливать их, и другие основные функции редактора. TMemo имеет ограничения на объем текста в 32Кб, это составляет 10-20 страниц. (Есть VBX и «родные» компоненты Delphi, где этот предел снят).

TButton позволяет выполнить какие-либо действия при нажатии кнопки во время выполнения программы. В Delphi все делается очень просто. Поместив TButton на форму, Вы по двойному щелчку можете создать заготовку обработчика события нажатия кнопки. Далее нужно заполнить заготовку кодом:

procedure TForm1. Button1Click (Sender: TObject);

begin

ShowMessage(`Test');

end;

TCheckBox отображает строку текста с маленьким окошком рядом. В окошке можно поставить отметку, которая означает, что что-то выбрано.

TListBox нужен для показа прокручиваемого списка. Классический пример ListBox'а в среде Windows - выбор файла из списка в пункте меню File | Open многих приложений. Названия файлов или директорий и находятся в ListBox'е.

TComboBox во многом напоминает ListBox, за исключением того, что позволяет водить информацию в маленьком поле ввода сверху ListBox. Есть несколько типов ComboBox, но наиболее популярен спадающий вниз (drop-down combo box), который можно видеть внизу окна диалога выбора файла.

TScrollbar - полоса прокрутки, появляется автоматически в объектах редактирования, ListBox'ах при необходимости прокрутки текста для просмотра.

TGroupBox используется для визуальных целей и для указания Windows, каков порядок перемещения по компонентам на форме (при нажатии клавиши TAB).

TBitBtn - кнопка вроде TButton, однако на ней можно разместить картинку (glyph). TBitBtn имеет несколько предопределенных типов (bkClose, bkOK и др), при выборе которых кнопка принимает соответствующий вид. Кроме того, нажатие кнопки на модальном окне (Form2. ShowModal) приводит к закрытию окна с соответствующим модальным результатом (Form2. ModalResult).

TSpeedButton - кнопка для создания панели быстрого доступа к командам (SpeedBar). Пример - SpeedBar слева от Палитры Компонент в среде Delphi. Обычно на данную кнопку помещается только картинка (glyph).

TScrollBox - позволяет создать на форме прокручиваемую область с размерами большими, нежели экран. На этой области можно разместить свои объекты.

TTimer - таймер, событие OnTimer периодически вызывается через промежуток времени, указанный в свойстве Interval. Период времени может составлять от 1 до 65535 мс.

Требования, предъявляемые к программе отправки и приёма сообщений.

Теперь можно уточнить постановку задачи: требуется написать систему, обеспечивающую выполнение следующих функций:

- реализация средств обмена информацией, используя вышеописанные протоколы;

- использование функций для удобной работы приёма и отправки сообщений;

- выдача данных пользователям по их запросам.

Система должна работать под управлением Windows 95, реализована в среде разработки Delphi 5. Система должна состоять из двух компонент - ядро реализации средств обмена информацией и пользовательская оболочка.

Выбор платформы проектирования, обоснование

В качестве операционной среды, в которой реализовался данный дипломный проект, была выбрана среда Windows9x (Windows NT). Причины этого следующие:

Распространенность этих ОС, в связи с чем получается охват большого числа возможных пользователей;

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

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

32-разрядность систем Windows9x и Windows NT увеличивает скорость работы с соответствующими числами.

В качестве среды программирования была выбрана среда Borland Delphi 5, сочетающая в себе как все преимущества всех средств, относящихся к RAD, так и свои собственные преимущества:

Простота и надежность создания и отладки программы;

Использование всех преимуществ операционных систем Windows'95 и Windows NT, включая 32-разрядность, многозадачность, удобный интерфейс и прочее;

Использование обработки исключений (exceptions), что позволяет повысить надежность работы программного продукта;

Наличие и доступность большого количества компонент, реализующих многие стандартные функции.

Учитывая специфику задачи и возможности операционной системы, разрабатываемая система должна подчиняться следующим требованиям.

Конфигурация технических средств

Требования к составу и параметрам технических средств:

i486 66 MHz процессор (Pentium или выше рекомендуется);

4MB оперативной памяти;

1Мб свободного пространства на жестком диске;

- Сетевой адаптер;

Необходимое программное обеспечение:

- Windows'95 или Windows NT 4 и выше;

- Поддержка протокола TCP/IP.

Рабочий проект

Интерфейс программы

Главная форма содержит следующие компоненты:

- Основное меню, состоящее из пунктов работы с сообщениями и опции для работы с программой.

- Кнопки для быстрой работы с сообщениями:

Кнопка «Send» предназначена для посылки сообщения на имя другого компьютера или группу.

Кнопка «Delete» удаляет текущее просмотренное сообщение.

Кнопки навигации по сообщениям:

а) Кнопка «<» осуществляет просмотр предыдущего сообщения.

б) Кнопка «>» осуществляет просмотр следующего сообщения.

- Строка состояния, показывающая текст «No Message» при отсутствии сообщений и информацию об отправителе, получателе и времени получения сообщения при их наличии.

- Окно для просмотра сообщений.

- Номер текущего сообщения и их общее количество; полезно при навигации и при получении большого количества сообщений.

Рис. 1.6. Главное окно программы отправки и получения сообщений.

Описание с методы работы с программой Messenger

Основное меню состоит из следующих подменю:

- Messages. Состоит из следующих всплывающих подменю:

Send, Previous, Next, Delete, Delete All и Exit.

Первые четыре подменю вызывают процедуру обработки нажатий «быстрых» кнопок и полностью аналогичны им по своим функциям.

Подменю Delete All удаляет сразу все пришедшие сообщения.

Подменю Exit осуществляет выход из программы.

- Данное подменю содержит параметры для работы с программой.

- History. Содержит историю отправленных и полученных сообщений.

- Help. Содержит информацию о работе с программой.

Рассмотрим отдельно каждую форму.

Рис. 1.7. Настройки программы

Play sound when new message arrives - Включение/отключение звука, подающегося на колонки через звуковую плату при получении сообщения.

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

Pop up dialog on message receipt - При включении данного параметра окно программы будет всплывать при получении сообщения.

Рис. 1.8. Окно истории сообщений

Рис. 1.9. Окно отправки сообщения

Рассмотрю более подробно визуальный процесс посылки сообщения.

При нажатии на кнопку «Send» быстрой работы с сообщениями, равно как и при вызове всплывающего подменю Send из меню Messages, вызывается новое окно, на котором находится:

Выбор получателя сообщений:

a) User or Computer. Им может являться имя пользователя, зашедшего в сеть Microsoft либо имя компьютера.

б) Workgroup. Сообщение можно послать на любую группу Win9x, в которую могут быть включены компьютеры.

Окно для написания получателя сообщений.

Окно сообщения.

Кнопка «Send» для отправления сообщения.

Кнопка «Cancel» для отмены отправления сообщения.

Кнопка «Select» для выбора адресата получателя.

Если размер отсылаемого или принятого сообщения больше размера формы для его написания, то на данной форме становится активным ScrollBar, с помощью которого можно прокручивать форму, тем самым просматривая сообщение.

При нажатии на кнопку «Select» вызывается окно поиска всех групп и компьютеров, находящихся в данной локальной сети.

Пользователю достаточно просто выбрать имя в ListBox'e и нажать кнопку «OK», после чего выбранное имя автоматически отобразиться в окне получателя сообщения.

Рис. 1.10. Выбор адресата получателя

Поиск компьютеров в локальной сети

Приведём пример кода программы, реализующую поиск компьютеров в локальной сети Microsoft.

procedure TForm4. Button1Click (Sender: TObject);

var Q, BufferSize: DWord;

R: THandle;

Buf: ^Buffer;

P: Pointer;

NR: ^NETRESOURCE;

begin

ListBox1. Clear;

if WNetOpenEnumA (RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, nil, R) = NO_ERROR then

begin

BufferSize:= 0;

Q:= $FFFFFFFF;

if WNetEnumResourceA (R, Q, Buf, BufferSize) <> NO_ERROR then

begin

Q:=1;

New(Buf);

while WNetEnumResourceA (R, Q, Buf, BufferSize) = NO_ERROR do

begin

begin

P:= Buf;

NR:= P;

ListBox1. Items. Add (NR^.lpProvider);

L. Add(Buf);

end;

Q:= $FFFFFFFF;

New(Buf);

end;

Dispose(Buf);

end;

WNetCloseEnum(R);

end;

end;

procedure TForm4. FormCreate (Sender: TObject);

begin

ListBox1. Clear;

L:= TList. Create;

end;

procedure TForm4. FormClose (Sender: TObject; var Action: TCloseAction);

var I: Integer;

begin

for I:= 0 to L. Count - 1 do

begin

Dispose (L. Items[I]);

end;

L. Free;

end;

procedure TForm4. Button2Click (Sender: TObject);

var

s:string;

begin

if ListBox1. ItemIndex<>-1 then

begin

s:=ListBox1. Items [ListBox1. ItemIndex];

if s[1]='\' then Delete (s, 1, 2);

Form2. Edit1. Text:=s;

ModalResult:=mrOK;

end;

end;

procedure TForm4. ListBox1DblClick (Sender: TObject);

var Q, BufferSize: DWord;

R: THandle;

Buf: ^Buffer;

P: Pointer;

NR: ^NETRESOURCE;

NREsource: NETRESOURCE;

I: Integer;

Err: Integer;

Path: string;

Sr: TSearchRec;

begin

NR:= L. Items [ListBox1. ItemIndex];

Move (NR^, NResource, SizeOf(NETRESOURCE));

ListBox1. Clear;

Path:= NResource.lpRemoteName;

Err:=WNetOpenEnumA (RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @NResource, R);

for I:= 0 to L. Count -1 do

begin

Dispose (L. Items[I]);

end;

L. Clear;

if Err = NO_ERROR then

begin

BufferSize:= 1024;

q:=1;

New(Buf);

while WNetEnumResourceA (R, Q, Buf, BufferSize) = NO_ERROR do

begin

begin

P:= Buf;

NR:= P;

ListBox1. Items. Add (NR^.lpRemoteName);

L. Add(Buf);

end;

New(Buf);

end;

Dispose(Buf);

end;

WNetCloseEnum(R);

end;

Отправление сообщений

Приведем часть кода программы, реализующую отправление сообщений:

function TForm2.NBName (s:string):string;

const

size=1024;

var

ncb:TNCB;

buf, p:PChar;

i, k:integer;

ch:char;

res:string;

begin

NBName:='';

GetMem (buf, size);

FillChar (ncb, SizeOf(TNCB), 0);

ncb.ncb_command:=char (NCBASTAT);

ncb.ncb_buffer:=buf;

ncb.ncb_length:=size;

for i:=1 to Length (s) do

ncb.ncb_callname [i_1]:=UpCase (s[i]);

for i:=Length (s) to NCBNAMSZ do ncb.ncb_callname[i]:=' ';

ncb.ncb_callname [NCBNAMSZ_1]:=#03;

ch:=netbios (addr (ncb));

if (ch<>#0) and (ncb.ncb_retcode<>#0) then Exit;

p:=ncb.ncb_buffer;

with PAdapterStatus (ncb.ncb_buffer)^ do

begin

p:=p+SizeOf (TAdapterStatus);

for i:=0 to name_count_1 do

begin

with PNameBuffer (p)^ do

begin

if (name [NCBNAMSZ_1]=' ') and ((ord (name_flags) and UNIQUE_NAME)=UNIQUE_NAME) then

begin

res:='';

for k:=0 to NCBNAMSZ_2 do if name[k]<>' ' then res:=res+name[k];

NBName:=res;

end;

end;

p:=p+SizeOf (TNameBuffer);

end;

end;

FreeMem (buf);

end;

procedure TForm2. Button1Click (Sender: TObject);

var

handle:THandle;

lpFileName:PChar;

lpNumberOfBytesWritten: Cardinal;

buffer:string;

i:integer;

s:LPSTR;

comp:string;

name, name2:PChar;

name1:string;

namesize:DWORD;

begin

Button1. Enabled:=False;

if RadioButton1. Checked then

begin

comp:=NBName (Edit1. Text);

lpFileName:=PChar ('\\'+comp+'\mailslot\messngr'+#0);

handle:=CreateFile (lpFileName, GENERIC_WRITE, 0, NIL, CREATE_ALWAYS, 0, 0);

if handle=INVALID_HANDLE_VALUE then

begin

ShowMessage ('Error when executing CreateFile()');

end;

buffer:='';

for i:=0 to Memo1. Lines. Count_1 do

buffer:=buffer+Memo1. Lines. Text+#10+#13;

name1:='';

namesize:=MAX_COMPUTERNAME_LENGTH + 1;

GetMem (name, MAX_COMPUTERNAME_LENGTH + 1);

GetComputerName (name, namesize);

name2:=name;

for i:=0 to namesize_1 do

begin

name1:=name1+name2^;

name2:=name2+1;

end;

FreeMem (name);

buffer:=name1+#0+Edit1. Text+#0+buffer;

s:=LPSTR (buffer);

WriteFile (handle, s^, length (buffer) - 2, lpNumberOfBytesWritten, NIL);

if length (buffer) - 2<>lpNumberOfBytesWritten then

begin

ShowMessage ('Error when writing file. Number Of Bytes Written: '+IntToStr (lpNumberOfBytesWritten));

end;

CloseHandle (handle);

end;

Button1. Enabled:=True;

end;

Используя функции NetBIOS, процедура Tform2.NBName определяет. является ли адресат пользователем удалённой машины или данное имя является самим компьютером, а также, не является ли адресат рабочей группой сети Microsoft.

Также, часть данной процедуры определяет, запущена или нет на данной машине ещё одна программа «всплывающих сообщений». Так как для совместимости с аналогичными программами требуется указать одно и то же имя почтового слота (в данном случае, имя компьютера, на котором запущено данное приложение), то при наличии другой подобной программы показывается окно с кодом ошибки. Код ошибки определяется средствами NetBIOS и в данной дипломной работе реализована процедурой NBName.

Рис. 1.11. Ошибка при создании почтового слота

Коды ошибок, выдаваемые NetBIOS, указаны в техническом проекте.

Структура приёма сообщений

Прикладная программа, используя интерфейс WinAPI и встроенные функции Windows, постоянно опрашивает почтовый слот на наличие приходящего сообщения. В отличие от DOS, например, в котором данная реализация представляла бы бесконечный цикл и все ресурсы компьютера уходили бы на ожидание сообщения, операционная среда Windows позволяет создавать такие циклы без практической потери ресурсов, разделяя части программы на потоки (threads). При наличии сообщения в почтовом слоте оно передаётся в программу средствами NetBIOS. Почтовый слот может содержать в себе любое количество сообщений, независимо от того, когда они все будут востребованы данной программой.

Прием сообщений можно реализовать следующим образом:

Var L: Tlist;

procedure TForm1. ShowMess;

var

p:PChar;

s:string;

begin

Memo1. Clear;

p:=L. Items[Current];

s:='Message from ';

repeat

s:=s+p^;

p:=p+1;

until (p^=#0);

p:=p+1;

s:=s+' to';

repeat

s:=s+p^;

p:=p+1;

until (p^=#0);

Label1. Caption:=s;

p:=p+1;

s:='';

repeat

s:=s+p^;

p:=p+1;

until (p^=#0);

Memo1. Lines. Add (s);

StatusBar1. Panels[0].Text:='Current message: '+IntToStr (current+1);

StatusBar1. Panels[1].Text:='Total number of messages: '+IntToStr (L. Count);

end;

procedure TForm1. Timer1Timer (Sender: TObject);

var

lpNextSize:DWORD;

lpMessageCount:pointer;

buffer:PChar;

lpNumberOfBytesRead:DWORD;

MessageCount, all:DWORD;

s:string;

begin

lpMessageCount:=addr (MessageCount);

if GetMailslotInfo (h, nil, lpNextSize, lpMessageCount, nil) then

begin

if lpNextSize<>MAILSLOT_NO_MESSAGE then

begin

Beep;

all:=MessageCount;

while all<>0 do

begin

GetMem (buffer, lpNextSize);

if ReadFile (h, buffer^, lpNextSize, lpNumberOfBytesRead, nil) then

begin

s:='';

L. Add (buffer);

StatusBar1. Panels[1].Text:='Total number of messages: '+IntToStr (L. Count);

if L. Count=1 then begin current:=0; ShowMess; end;

GetMailslotInfo (h, nil, lpNextSize, lpMessageCount, nil);

end

else FreeMem (buffer);

all:=all_1;

end;

end;

end;

end;

Процедура Timer1Timer является ядром получения сообщений, в то время как ShowMess - реализацией выдачи сообщения на экран в виде, понятном пользователю.

Строки

StatusBar1. Panels[0].Text:='Current message: '+IntToStr (current+1);

StatusBar1. Panels[1].Text:='Total number of messages: '+IntToStr (L. Count), входящие в состав данной процедуры, характеризуют номер сообщения по счёту всего количества сообщений и количество всех сообщений.

С учетом вышеописанного, пришедшее сообщение выглядит таким образом:

Рис. 1.12. Пример полученного сообщения

Используя кнопки навигации, можно легко просматривать все пришедшие сообщения, одновременно использую другие функции Messenger'a.

Страницы: 1, 2


© 2010 BANKS OF РЕФЕРАТ