Диплом: Проектирование и разработка сетевых броузеров на основе теоретико-графовых моделей - текст диплома. Скачать бесплатно.
Банк рефератов, курсовых и дипломных работ. Много и бесплатно. # | Правила оформления работ | Добавить в избранное
 
 
   
Меню Меню Меню Меню Меню
   
Napishem.com Napishem.com Napishem.com

Диплом

Проектирование и разработка сетевых броузеров на основе теоретико-графовых моделей

Банк рефератов / Программирование

Рубрики  Рубрики реферат банка

закрыть
Категория: Дипломная работа
Язык диплома: Русский
Дата добавления:   
 
Скачать
Архив Zip, 559 kb, скачать бесплатно
Заказать
Узнать стоимость написания уникальной дипломной работы

Узнайте стоимость написания уникальной работы

101 МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ ТАВРИЧЕСКИЙ НАЦИОНАЛЬНЫЙ У НИВЕРСИТЕТ им . В.И.Вернандского МАТЕМАТИЧЕСКИЙ ФАКУЛЬТЕТ КАФЕДРА ИНФОРМАТИКИ ДИПЛОМНАЯ РАБОТА Проектирование и разработка сетевых броузеров на основе теоретико-графовых моделей Выполнил студент 5 курса специальности «информатика» _________________Поляков Т.И. Симферополь 2000 г. Содержание Введение 2 Глава I . Теоретико-графовые модели организации сетевых структур 3 1.1. Основные понятия теории графов 3 1.2. Графовые алгоритмы 5 Глава II . Сетевые структуры на базе теоретико-графовых моделей 11 2.1. Методы построения сетевых структур 11 2.2. Классификация существующих методов организации сетей 12 2.3. Глобальная сеть Internet 16 2.4. Ос новы сетевой маршрутизации 20 2.5. Алгоритмы маршрутизации 24 Глава III. Сетевые броузеры 33 3.1. Описание стандартного броузера 33 3.2. Характеристика существующих систем поиска 33 3.3. Особенности создания б роузеров в визуальных средах программирования 40 Глава яяя Программная реализация 44 4.1. Архитектура системы “броузер” 44 4.2. Основные процедуры броузера 45 4.3. Архитектура имитацион ной модели глобальной сети 47 4.4. Основные процедуры имитационной модели 48 Заключение 50 Список литературы 51 Приложение 1 – исходный текст программы “ броузер ” 52 Приложение 2 – исходный текст модели корпоративной сети 91 Вве дение Актуальность В связи с расширением глобальной сети Internet возрастает необходимость внедрения новых оптимизационных алгоритмов , связанных со скоростью обмена данных между компьютерами в единой сети . Компьютерные сети завоевывают мир . Системы из маленьких компьютеров превращаются в огромные хранилища данных , доступные всему миру . Любая современная фирма , любой офис оснащен хотя бы простейшей сетью . Не выходя из дома , сотни тысяч людей работают на персональных компьютерах , принося пользу всему мир у . В основном для работы в Internet используются программы-броузеры . Эти программы позволяют легко обмениваться текстовой , графической и звуковой информацией , используя популярную , простую в обращении мультемедийную службу ИНТЕРНЕТ World Wide Web . Цель Цель данной работы заключается в следующем : - разработка математической модели сетевого броузера и корпоративной среды ; - создание имитационной модели распределении информации в глобальных сетях. Для достижения данной цели были решены следующие задачи : 1.) Проведен анализ существующих броузеров ; 2.) Рассмотрены основные топологии существующих корпоративных сетей ; 3.) Разработан алгоритм определения оптимального маршрута передачи информации по глобальной сети. 1. Теоретико – графовые модели организации сетевых структур 1.1. Основные понятия теории графов Определение. Множество Х = и набор U неупорядоченных пар объектов ( ) из Х называется графом Г . Объекты множества Х называются вершинами графа , а наборы объекта U – ребрами графа . Про ребра будем говорить , что они соединяют вершины и . В случае , если множество Х и набор U состоят из конечного числа объектов и пар , то граф Г называется конечным. Пусть и - произвольные вершины графа Г. Определение. Система ребер графа Г называется путем , соединяющим вершины и . Определение. Путь , не проходящий дважды одно ребро , называется циклом , если = . В частности , цикл будем называть петлей . Определение. Граф Г называется связным , если для любых двух различных вершин и графа Г существует путь , соединяющий эти вершины. Рис . 1 Легко видеть , что граф из примера 1 является конечным , несвязным и содержащим петли. Определение . гра фы Г и Г ` называются изоморфными , если существует взаимно однозначное соответствие между их вершинами и ребрами такое , что соответствующие ребра соединяют соответствующие вершины. Определение. Граф Г ` называется подграфом Г , если его вершины и ребра принад лежат графу Г. Длиной пути в графе называют сумму длин входящих в этот путь ребер. Определение. Деревом называется конечный связный граф с выделенной вершиной , именуемой корнем , не содержащий циклов. Если в графе можно выделить более одного дерева , которые не связны между собой , то такой граф называют лесом. Рис 2. Лес , имеющий две компоненты связности (2 дерева ). Будем далее обо значать через Х – множество вершин и U – множество ребер графа , а сам граф , определяемый этой парой объектов , будем обозначать < X , U >; x яя X , u яя U . Обозначим длину дуги u =( x , y ) через d ( u ). Кратчайшую длину пути из х в z обозначим D ( x , z ). Очевидно , ес ли кратчайший путь из x в z существует и проходит через промежуточную вершину w , то D ( x , z ) = D ( x , w ) + D ( w , z ). Эта формула справедлива для любой промежуточной вершины w рассматриваемого пути , в том числе и для последней , смежной с конечной вершиной w . Поэ тому кратчайший путь можно отыскать , последовательно переходя от конечной вершины z в ближайшую смежную и запоминая цепочку построенных вершин (конечно , при условии , что хотя бы один путь между вершинами x и z существует и граф не содержит циклов . Эта ид ея и является в сущности принципом Р.Беллмана . 1.2. Графовые алгоритмы Алгоритм Беллмана поиска кратчайшего пути между двумя вершинами связного графа , не имеющего циклов с неотрицательными длинами ребер . Его описание приводится ниже при помощи алгоритм ической схемы . Идентификаторы : D [ w ] – рабочий массив , при вычислениях интерпретируется как кратчайшая длина из вершины w в вершину z . w я X . d [ s , t ] – массив длин ребер графа для каждой пары вершин s , t я X . Если некоторое ребро отсутствует , то в элементе э того массива полагается записанным некоторое достаточно большое число , превышающее сумму длин всех ребер графа . я Stack – последовательность вершин , определяющая кратчайший путь из x в z . Begin Stack:= ’ ’ ; // Очистить Stack. Stack <= z ; // Поме стить в стек конечную вершину z . w := z ; // Запомнить первую пройденную вершину. D [ z ]:=0; // Обнуление длины пути из вершины z в нее же. While w =/= x do // Пока не будет достигнута начальная вершина , выполнять // перебор вершин графа p := вершина , для которой величина D [ p ] = d [ p , w ]+ D [ w ] минимальна . Если таких вершин несколько и среди них имеется вершина x , то p := x , если же среди них нет вершины x – взять любую из доставляющих минимум сумме. Stack <= p ; // Записать выбранную вершину в стек. w := p ; // и взять ее для построения следующего шага. End ; End . Пусть число вершин графа | X |= n , а число ребер | U |= m . Оценим сложность этого алгоритма как число шагов выполнения алгоритмической схемы , считая одним шагом выполнение ровно одного выполнимого оператора , каковые представлены только строками 2 ,3,4,5,6,8,9. В худшем случае выбор вершины в строке 8 (по минимуму расстояния ) произойдет в результате просмотра всех n вершин , а цикл с заголовком в строке 6 повторится для всех вершин , поэтому сложность алгоритма можно оценить как C * n ^2 , где С – некоторая константа , учитывающая реализацию алгоритма в произвольной вычислительной среде . Следующий алгоритм обеспечивает нахождение кратчайших расстояний от фиксированной вершины х , называемой источником , до всех остальных вершин графа с ограничением , предполагающим отсутствие в графе контуров отрицательной длины (сумма длин ребер , входящих в любой контур , неотрицательна ). Алгоритм Фо рда-Беллмана Идентификаторы : d [ s , t ] – массив длин ребер графа для каждой пары вершин s , t я X . Если ребра нет , то соответствующий элемент этого массива содержит достаточно большое число. х – вершина-источник графа < X , U >. n =| X | - число вершин графа. u , w , k – рабочие переменные. D [ w ] – массив , в котором к концу работы алгоритма будут содержаться кратчайшие длины путей из х в w для всех вершин w я X . Begin D [ x ]:=0; // Длина пути из источника x . For w я X do D [ w ]:= d [ x , w ]; // Инициализация матрицы расстояний For k:=1 to n-2 do // Повторять n-2 раз For w я X \ x do // Ци кл по всем вершинам , кроме источника. For u я X do D[w]:=min(D[w],D[u]+d[u,w]); // выбор минимума. End . Этот алгоритм также основан на соотношении (принципе оптимальности ) Беллмана . Всякий раз , когда находится путь через транзитную вершину u , который короче найденного пути из х в w , он заменяется на более короткий путь . Это соотношение должно проверяться для любой возможной из n -2 транзитных вершин при оценке пути в каждую вершину , поэтому в алгоритме имеется цикл , определенный в строке 4. Алг оритм Дейкстры нахождения кратчайших расстояний от источника до всех остальных вершин применим только тогда , когда граф не имеет контуров или когда веса всех ребер неотрицательны. Идентификаторы : d [ s , t ] – массив длин ребер графа для каждой пары вершин s , t я X . Если ребра нет , то соответствующий элемент этого массива содержит достаточно большое число. х – вершина-источник графа < X , U >. n =| X | - число вершин графа. u , w – рабочие переменные. D [ w ] – массив , в котором к концу работы алгоритма будут содержаться кр атчайшие длины путей из x в w для всех вершин w я X . BEGIN D[x]:=0; For w я X do D[w]:=d[x,w]; T:= X\ x ; While T=\= do Begin w:= вершина r из T такая , что D[r]=min D[p]:p из T ; T:= T\ w ; For u я T do D[w]:=min[D[w],D[u]+d[u,w]]; End END Алгоритм Форда-Фалкерсона нах ождения максимального потока в сети. Многие задачи исследования операций сводятся к анализу потоков , маршрутов , последовательностей событий , протекающих со времени , и других процессов , которые можно представить в виде множества взаимосвязанных элементов . Д ля математического представления таких процессов удобно их задание в виде графов. Рассмотрим конечный ориентированный граф Г = ( X , u ), в котором Х = x 1,..., xn -множество вершин , U – множество дуг . Пусть x яя X . Обозначим E +( x ) – множество дуг графа , входящих в х , E -( x ) – выходящих из х. Множества начальных вершин дуг из Е +(х ) и множество конечных вершин дуг из Е -(х ) обозначим соответственно S +( x ) и S -( x ). E+(x) E-(x) y x y S+(x) S-(x) Рис . 3. Окрестность вершины графа. Граф Г называют транспортной сетью , если каждой дуге u соответствует целое число c ( u )>=0 и найдутся x 0 и z из Х такие , что Е +(х 0)= Е -( z )= . Вершина х 0 называется истоком , z - стоком , c ( u ) – пропускной способностью дуги . Потоком в транспортной сети называют целочисленную функцию ф ( u ) , удовлетворяющую следующим условиям : 1) 0<= ф ( u )<= с (u) 2) ф ( u ) - ф ( u ) = 0 для любой вершины x =/= x 0, x =/= z . u яя Е +(х ) u яя Е -(х ) При этом поток не может «накапливаться» ни в одной вершине транспортной сети , кроме истока х 0 и стока z , поэтому ф ( u ) = ф ( u ) = Ф. u яя Е +(х ) u яя Е -(х ) Величину Ф называют пото ком транспортной сети . Дуга u называется насыщенной , если ф ( u )= c ( u ) . Поток Ф называется полным , если каждый путь из х 0 в z содержит хотя бы одну насыщенную дугу. Рассмотрим разбиение R множества вершин сети Х = Х 1 UX 2, X 1 я X 2 яя X 1 я X 2= я , x 0 я X 1, z я X 2, называе мое разрезом сети. Сумма пропускных способностей множества ( xi , xj ), xi из X 1, Xj из Х 2 определяет пропускную способность разреза R : r ( R ) = c ( u ), u я ( xi , xj ): xi я X 1, xj я X 2 Поскольку для любой дуги u выполняется неравенство ф ( u ) <= c ( u ), то Ф <= r ( R ). Теорема Форда-Фалкерсона : максимальный поток в сети равен минимальной величине разрезов в этой сети. Алгоритм нахождения максимальн ого потока , предложенный Фордом и Фалкерсоном , состоит в постепенном увеличении допустимого потока Ф до максимальной величины Ф *. Начальное значение потоков полагается равным нулю . Процесс увеличения потока состоит в поиске путей , на которых возможно увел и чение потока , с соответствующей разметкой вершин сети. Алгоритм Форда-Фалкерсона Предполагается , что путь из истока в сток с ненулевыми пропускными способностями входящих в него дуг существует. I . Увеличение потока. 1. Присвоить истоку х 0 пометку (+х0 , d ( x 0) = ) . Это означает , что вход в исток не ограничен ; величина d всегда показывает , на сколько может быть увеличен поток , входящий в помеченную вершину . Здесь символ обозначает достаточно большое число – начальное значение пометки. 2. В зять некоторую вершину xi с пометкой , которая в общем случае имеет вид (+ или – xk , d ( xi )), где xk – обозначение вершины , d ( xi ) – некоторое число . Каждой непомеченной вершине xj из S -( xi ), для которой ф ( xi , xj ) <с ( xi , xj ) , присвоить пометку (+ xi , min [ d ( xi ), c ( xi , xj )- ф ( xi , xj )]) . Это означает , что поток в дуге ( xi , xj ) может быть увеличен (знак плюс ) на величину , определяемую минимумом . Каждой непомеченной вершине xj из S +( xi ) , такой , что ф ( xj , xi ) >0 присвоить пометку ( - xi , min [ d ( xi ), ф ( xj , xi )]) , что означает возможность уменьшения потока на величину , определяемую минимумом. 3. Если сток не помечен и можно пометить какую-либо вершину , кроме стока , то перейти к п .2. 4. Если оказался помеченным сток z , и в его пометку входит число d ( z ) , то между вершинами x 0 и z найдется цепь , все вершины которой помечены номерами предыдущих вершин . Для каждой помеченной вершины х в этой цепи изменить величину потока : ф '( y , x )= ф ( y , x )+ d ( z ), если х имеет пометку ( + y , d ( x )) или ф '( y , x )= ф ( y , x )- d ( z ), если х имеет пометку ( - y , d ( x )). Пометка вершины х стирается , назначенные потоки запоминаются . При достижении (в процессе стирания пометок вершин цепи ) истока х 0 перейти к п .1; если же ни одну вершину пометить не удается и сток z не помечен , то перейти к построен ию разреза. II .Построение разреза. Искомый минимальный размер R определяется двумя множествами Х 1 и Х 2, где Х 1 – все помеченные вершины , Х 2 – вершины , которые не удается пометить . При этом полный поток Ф =Ф * должен быть равен величине полученного минимально го разреза . 2. Сетевые структуры на базе теоретико-графовых моделей 2.1. Методы построения сетевых структур Компьютерная сеть состоит из элементов , среди которых выделяют компьютеры , предоставляющи е ресурсы в сети (серверы ), компьютеры , обеспечивающие доступ к сетевым ресурса серверов (клиенты ), среду ( media ) , в которой реализованы соединения , и сами ресурсы – файлы , процессоры , принтеры , и другие элементы . В сетях реализуется принципиальная возможн ость совместного использования и устройств , и данных. Соединения компьютеров в сети может осуществляться по-разному , и различным типовым способам присвоены различные наименования. Различают сети с выделенными серверами и одноранговые сети . В настоящее врем я наиболее распространенными являются сети с архитектурой клиент-сервер , которые используют центральный сервер для обслуживания запросов клиентов , в то время как одноранговые сети позволяют любой рабочей станции функционировать одновременно в качестве сер в ера , если этого требуют задачи. В сетях с архитектурой клиент-сервер специализированный компьютер (выделенный сервер ) используется для установки всех разделяемых ресурсов . Такое решение ускоряет доступ пользователей к централизованным ресурсам сети и связа но с рядом особенностей : - сетевое администрирование проще за счет незначительного числа серверов в сети и их узкой специализации ; - предъявляются высокие требования к выделенному серверу : для обеспечения высокой производительности требуется установка на сервере большого количества оперативной памяти , диска большой емкости и использования в сервере производительного процессора ; - при нарушении работы сервера сеть становится практически неработоспособной. Если в одноранговой сети нет выделенного сервера , в се компьютеры равноправны в том смысле , что могут рассматриваться и как серверы , и как клиенты . Обычно одноранговые сети содержат до десяти компьютеров. Одноранговая сеть на основе сервера содержит выделенный сервер . Сеть может содержать не один , а несколь ко серверов , имеющих специальное назначение : - файл-серверы ; - принт-серверы ; - серверы приложений , на которых выполняются прикладные задачи ; - почтовые серверы ; - факс-серверы ; - коммуникационные серверы , управляющие потоком данных и почтовых сообщений м ежду сетью , в которой они размещены , и другими сетями , мэйнфреймами (большими ЭВМ ) или удаленными пользователями через модемы и телефонные линии ; - серверы служб каталогов , обеспечивающие поиск , хранение и защиту информации в сети. В комбинированных сетях совмещаются лучшие качества одноранговых сетей и сетей на основе сервера . Используется сервер , но и другие отдельные компоненты могут разрешать доступ к своим данным. 2.2. Классификация существующих методов организации сетей Базовые топологии локальных се тей Базовые топологии локальных сетей – это основные виды конфигураций соединений элементов сетей при помощи кабеля. Рассмотрим три базовых топологии : шина , звезда и кольцо . Шина (или линейная шина ) – это топология , представленная на рис . 4. Рис . 4. Простейшая одноранговая сеть. Передаваемый сигнал распространяется по кабелю – магистрали (сегменту ) и поглощается на концах терминаторами (заглушками ). В любой момент времени только один компьютер может вести передачу . Данные передаются все м компьютерам сети , однако информацию принимает только тот , адрес которого соответствует адресу получателя , зашифрованному в передаваемых данных. Говорят , что шина – пассивная топология . Компьютеры только “слушают” , но не регенерируют сигналы . Подсоединени е кабеля осуществляется при помощи баррел-коннекторов и репитеров. Баррел-коннекторы – это специальные металлические соединительные разъемы ; они позволяют сращивать кабель , но при большом количестве стыковок сигнал ощутимо затухает . Для решения проблемы со хранения физических параметров сигналов , распространяющихся в компьютерных сетях , применяют специальные устройства. Репитер – это повторитель-формирователь , просто усиливающий сигнал. Топология звезда предусматривает подключение всех компьютеров с помощью сегментов кабеля к центральному элементу . Различают два подтипа этой топологии – пассивная звезда , в центре которой нет компьютера-абонента , кабели соединены при помощи концентратора ( hub ) , и активная звезда , содержащая в центре компьютер , управляющий обм еном информации в сети . Концентратором ( hub ) называют устройство , служащее для объединения нескольких сегментов сети и не преобразующее передаваемую информацию . Сигналы от передающего компьютера поступают через концентратор ко всем остальным . Концентраторы бывают активные , пассивные и гибридные. Активная звезда обеспечивает бесконфликтное управление , но нарушения в работе центра приводят к выходу из строя всей сети , но зато сеть с такой топологией мало чувствительна к выходу из строя участков соединительног о кабеля. Топология кольцо предусматривает передачу сигналов по кольцу в одном направлении , так , что сигналы проходят через каждый компьютер (рис .5). В отличие от пассивной топологии “шина” , здесь каждый компьютер выступает в роли репитера , усиливая сигнал ы и передавая их следующему компьютеру. Сервер Рис .5. Топология “Кольцо”. Типы кабелей Тип кабеля , выбранного для соединения сетевых компонентов между собой , определяет максимальную скорость переда чи данных в сети и возможную удаленность компьютеров друг от друга . Это связано с частотными свойствами процессов распространения сигналов . Основными и наиболее распространенными являются следующие типы кабелей : - Коаксиальный ( coaxial ) , подразделяющийся на толстый и тонкий ; - Витая пара ( twisted pair ), имеющая два типа : неэкранированная (10 Base - T ) и экранированная. - оптоволоконный ( fiber optic ) . Толстый кабель обеспечивает передачу сигналов на большие расстояния , чем тонкий , -до 500 метров , и часто ис пользуется в качестве основного магистрального кабеля ( backbone ) . Для подключения к толстому коаксиальному кабелю применяют специальное устройство – трансивер ( TRANSmitter / reCEIVER – передатчик.приемник ) , устройство , преобразующее поток параллельных данных , который использует шина компьютера , в поток последовательных данных , направляемых по кабелю к другому компьютеру . Трансивер , используемый для подключения к толстому кабелю , снабжен специальным коннектором , который называют «зуб вампира» или «пронзающий о тветвитель» . Чтобы подключить трансивер к сетевому адаптеру , нужно подключить кабель трансивера к коннектору AUI - порта сетевой платы . Этот коннектор известен как DB -15 ( 15-ти контактный ). Витая пара дешевле коаксиального кабеля и менее надежна . Использова ние неэкранированной витой пары позволяет реализовать длину сегментов соединения до 100 метров . Для подключения витой пары используются восьмиконтактные коннекторы RG -45 . Оптоволоконный кабель имеет высокую стоимость и обладает рядом преимуществ : слабое затухание сигнала , практическая невозможность вскрытия оптоволокна с целью перехвата данных . Такой кабель передает данные только в одном направлении и поэтому состоит из двух волокон с отдельными коннекторами. Использование оптоволоконного кабеля теоретиче ски может позволить осуществлять передачу данных со скоростью 200000 Мб /сек. Платы сетевого адаптера Платы сетевого адаптера принимают параллельные данные с шины компьютера и преобразуют их в последовательный битовый код , используемый при передаче по кабе лю . Плата сетевого адаптера должна указать свое местонахождение или сетевой адрес , чтобы ее можно было отличить от остальных плат . Сетевые адреса определены комитетом IEEE , закрепившим за каждым производителем таких плат некоторые интервалы адресов . Эти ад реса «зашиты» в микросхемы . Благодаря этому каждая плата и каждый компьютер имеют уникальный адрес в сети . Плата сетевого адаптера запрашивает у компьютера данные из памяти по шине , и если они поступают быстрее , чем может передать плата , то данные временн о помещаются в буфер. Перед передачей данных передающая плата проводит диалог с принимающей платой , осуществляя согласование информации о следующих параметрах передачи : - максимальном размере блока передаваемых данных ; - объеме данных , передаваемых без под тверждения о получении ; - интервалах между передачами блоков данных ; - интервале , в течение которого необходимо послать подтверждение ; - объеме данных , которые может принять каждая плата без возникновения ситуации переполнения ; - скорости передачи данных. 2.3. Глобальная сеть Internet Наиболее распространенные сетевые протоколы Определение. Протоколы являются набором правил и процедур , предназначенных для установления связей в сети. Набор протоколов сети Internet , TCP / IP ( Transmit Control Protocol / Intern et Protocol ) является промышленным стандартом протоколов , обеспечивающих связь компьютеров разных типов. Основные протоколы передачи данных высокого уровня : WWW ( World Wide Web ) – важнейший ресурс Internet , обеспечивающий гипертекстовое представление инф ормации и гипертекстовые ссылки для единого представления и доступа во всемирной глобальной сети. Gopher – усовершенствованная система передачи файлов . Позволяет , используя систему меню , просматривать списки ресурсов , пересылать нужный материал , просматрив ать данные . Компьютеры , использующие Gopher , можно представить соединенными в единую информационно-поисковую систему GopherSpace . WAIS – индексная поисковая система глобального информационного сервера. SNMP ( Simple Network Management Protocol ) – протокол с ети Internet для мониторинга сети и сетевых компонентов. FTP (File Transfer Protocol) – протокол сети Internet для передачи файлов . Поддерживает процесс передачи файлов между локальным и удаленным компьютером . Имеет ряд команд , которые реализуют двунаправл енную передачу двоичных и ASCII - файлов между компьютерами . Telnet – протокол сети Internet для регистрации на удаленных хостах и обработки данных на них. SMTP ( Simple Mail Transfer Protocol ) – протокол сети Internet для обмена электронной почтой. TCP ( Tra nsmission Control Protocol ) – TCP / IP – протокол для гарантированной доставки данных , разбитых на последовательность фрагментов. IP ( Internet Protocol ) – протокол сетевого уровня из набора протоколов Internet , обеспечивающий правильную передачу пакетов . IP является базовым элементом технологии Internet . Его центральная часть – таблица маршрутов . Этот протокол использует таблицу маршрутов при принятии всех решений о маршрутизации IP - пакетов. OSPF ( Open Shortest Path First ) – алгоритм маршрутизации , использующ ий состояние каналов , в его основе лежит алгоритм Дейкстры . OSPF вычисляет маршруты , учитывая количество маршрутизаторов , через которые пакет пройдет на пути к получателю , пропускную способность линии , трафик и стоимость . Набор протоколов IPX / SPX и NWlink ( Internetwork Packet Exchange / Sequenced Packet Exchange ) – стэк протоколов , используемых в сетях Novell . Это относительно небольшой и быстрый протокол , поддерживающий маршрутизацию . NWlink – реализация IPX / SPX фирмой Microsoft для использования в качест ве транспортного маршрутизируемого протокола. Концепция сокетов Сетевой сокет ( network socket ) во многом напоминает электрическую розетку . В сети имеется множество сокетов , причем каждый из них выполняет стандартные функции . Все , что поддерживает стандарт ный протокол , можно «подключить» к сокету и использовать для коммуникаций . Для электрической розетки не имеет значения , что именно вы подключаете – лампу или тостер , поскольку оба прибора рассчитаны на напряжение 220 Вольт и частоту 50 Герц . Несмотря на т о , что электричество свободно распространяется по сети , все розетки в доме имеют определенное место . Подобным образом работают и сетевые сокеты , за исключением того , что электроны и почтовые адреса заменены на пакеты TCP / IP и IP - адреса . Internet Protocol ( I P ) является низкоуровневым протоколом маршрутизации , который разбивает данные на небольшие пакеты и рассылает их по различным сетевым адресам , что не гарантирует доставку вышеупомянутого пакета адресату . Transmission Control Protocol ( TCP ) является протоко лом более высокого уровня , собирающим пакеты в одну строку , сортирующим и перетранслирующим их по мере необходимости , поддерживая надежную рассылку данных . Третий протокол , UNIX Domain Protocol ( UDP ) , используется вместе с TCP и может применяться для быстр ой , но ненадежной передачи пакетов. Клиент /сервер Под термином сервер подразумевается любой объект с общедоступными ресурсами . Клиентом называется любой другой объект , желающий получить доступ к определенному серверу . Взаимодействие между клиентом и серве ром во многом подобно взаимодействию лампы и розетки . Электрическая сеть является сервером , а лампа является клиентом напряжения . Сервер постоянно предлагает свои «услуги» , в то время как клиент волен в любое время отключиться от обслуживания. В сокетах Be rkley понятие сокета позволяет одному компьютеру обслуживать несколько различных клиентов одновременно , а также одновременно обрабатывать информацию различных типов . Это стало возможным после введения понятия порта , который является нумерованным сокетом на определенном компьютере . Серверу разрешено обслуживать несколько клиентов , подсоединенных к одному порту , но не одновременно . Для управления соединением нескольких клиентов процесс сервера должен быть многопоточным или иметь другие средства мультиплексир о вания одновременных операций ввода-вывода. Зарезервированные сокеты После физического подключения выбирается протокол высокого уровня , который зависит от используемого порта . Согласно спецификации протокола TCP / IP , первые 1024 порта резервируются для опре деленных задач . Порт номер 21 предназначен для протокола FTP , 23 – для Telnet , 25 – для электронной почты , 79 – для протокола finger , 80 – для HTTP , и т.д . Каждый протокол определяет , каким образом клиент должен взаимодействовать с портом . Например , прото кол HTTP используется Web - броузерами и серверами для передачи гипертекстовых страниц и изображений . Работает он следующим образом . Когда клиент запрашивает файл от сервера HTTP (это действие известно под названием попадание – hit ) , он просто записывает имя файла в специальном формате в определенный порт и получает обратно содержимое файла . Сервер также возвращает код состояния , сообщающий клиенту о возможности удовлетворения запроса , и причину отказа .. Вот пример запроса клиентом файла / index . html , в ответ на который сервер передает содержимое файла. СЕРВЕР КЛИЕНТ Опрашивает порт 80 Подключается к порту 80 Определяет подключение Записывает « GET / index . html к серверу HTTP /1.0\ n \ n » Считывает до второго символа новой строки ( \ n ) Определяет команду GET как известную команду и протокол HTTP /1.0. Считывает файл / index . html Записывает « HTTP /1.0 200 OK \ n \ n » ( « 200» означает «дальше идет содержимое файла» ) Копирует содержимое файла в сокет Считывает файл и выводит его Отключается Отключается Транслирующие серверы Транслирующие серверы ( proxy servers ) передают часть протокола клиента другому серверу . Это необходимо в случаях , когда клиенты имеют определенные ограничения при подключении к серверу . Таким образом , клиент может быть подключен к другому серверу , не имеющему подобных ограничени й , а тот , в свою очередь , будет осуществлять все операции клиента . Транслирующий сервер имеет возможность фильтровать определенные запросы или накапливать (кэшировать ) результаты этих запросов для дальнейшего использования . Транслирующий HTTP сервер , подде рживающий кэширование , в состоянии уменьшить количество запросов связи локальных сетей с Internet . Если популярная web - страница затребована сотнями пользователей , транслирующий сервер может , считав ее содержимое с web - сервера только один раз , сохранить ее в буфере и обеспечить более быстрый доступ к ней клиентов. Адресация Internet Каждый компьютер в Internet имеет адрес . Им является число , однозначно определяющее компьютер в сети . На IP - адрес отводится 32 бита и мы часто представляем подобные адреса в виде последовательности чисел в интервале от 0 до 255, разделенных точками . Это облегчает их запоминание , поскольку адреса присваиваются отнюдь не беспорядочно – прослеживается определенная иерархия. Служба доменных имен ( DNS ) Internet не была бы столь дружес твенной сетью , если бы существовала необходимость задавать адреса только числами . Например , сложно себе представить появление ссылки на адрес « http ://192.9.9.1/ » в рекламном объявлении . К счастью , существует служба , обеспечивающая поиск информации в Intern et с помощью имен ,- служба доменных имен (Domain Name Service - DNS). Точно так же , как четыре числа IP- адреса описывают сетевую иерархию слева направо , имя адреса Internet , называемое именем его домена , описывает положение машины в пространстве имен Inter net справа налево . Например , www.starwave.com означает , что адресат находится в домене com ( зарезервированном для коммерческих сетей США ) и называется starwave ( название компании ), а www является именем определенного компьютера – в данном случае web- сервер а компании starwave . www соответствует крайнему правому числу в эквивалентном IP- адресе. 2.4. Основы сетевой маршрутизации Библиографическая справка В общедоступном значении слова маршрутизация означает передвижение информации от источника к пункту назнач ения через объединенную сеть . При этом , как правило , на пути встречается по крайней мере один узел . Маршрутизация часто противопоставляется объединению сетей с помощью моста , которое , в популярном понимании этого способа , выполняет точно такие же функции. Основное различие между ними заключается в том , что объединение с помощью моста имеет место на Уровне 2 эталонной модели ISO, в то время как маршрутизация встречается на Уровне 3. Этой разницей объясняется то , что маршрутизация и объединение по мостовой с х еме используют различную информацию в процессе ее перемещения от источника к месту назначения . Результатом этого является то , что маршрутизация и объединение с помощью моста выполняют свои задачи разными способами ; фактически , имеется несколько различных в идов маршрутизации и объединения с помощью мостов . Тема маршрутизации освещалась в научной литературе о компьютерах более 2-х десятилетий , однако с коммерческой точки зрения маршрутизация приобрела популярность только в 1970 гг . В течение этого периода се ти были довольно простыми , гомогенными окружениями . Крупномасштабное объединение сетей стало популярно только в последнее время . Компоненты маршрутизации Маршрутизация включает в себя два основных компонента : определение оптимальных трактов маршрутизаци и и транспортировка информационных групп (обычно называемых пакетами ) через объединенную сеть . В настоящей работе последний из этих двух компонентов называется коммутацией . Коммутация относительно проста . С другой стороны , определение маршрута может быть о чень сложным процессом . Определение маршрута Определение маршрута может базироваться на различных показателях (величинах , результирующих из алгоритмических вычислений по отдельной переменной - например , длина маршрута ) или комбинациях показателей . Про граммные реализации алгоритмов маршрутизации высчитывают показатели маршрута для определения оптимальных маршрутов к пункту назначения . Для облегчения процесса определения маршрута , алгоритмы маршрутизации инициализируют и поддерживают таблицы маршрутизац ии , в которых содержится маршрутная информация . Маршрутная информация изменяется в зависимости от используемого алгоритма маршрутизации . Алгоритмы маршрутизации заполняют маршрутные таблицы неким множеством информации . Ассоциации "Пункт назначения /следующ ая пересылка " сообщают роутеру , что определенный пункт назначения может быть оптимально достигнут путем отправки пакета в определенный роутер , представляющий "следующую пересылку " на пути к конечному пункту назначения . При приеме поступающего пакета роуте р проверяет адрес пункта назначения и пытается ассоциировать этот адрес со следующей пересылкой . В маршрутных таблицах может содержаться также и другая информация . "Показатели " обеспечивают информацию о желательности какого-либо канала или тракта . Роутеры сравнивают показатели , чтобы определить оптимальные маршруты . Показатели отличаются друг oт друга в зависимости от использованной схемы алгоритма маршрутизации . Далее в этой главе будет представлен и описан ряд общих показателей . Роутеры сообщаются друг с другом (и поддерживают свои маршрутные таблицы ) путем передачи различных сообщений . Одним из видов таких сообщений является сообщение об "обновлении маршрутизации ". Обновления маршрутизации обычно включают всю маршрутную таблицу или ее часть . Анализируя и нформацию об обновлении маршрутизации , поступающую ото всех роутеров , любой из них может построить детальную картину топологии сети . Другим примером сообщений , которыми обмениваются роутеры , является "объявление о состоянии канала ". Объявление о состоянии канала информирует другие роутеры о состоянии каналов отправителя . Канальная информация также может быть использована для построения полной картины топологии сети . После того , как топология сети становится понятной , роутеры могут определить оптимальные ма р шруты к пунктам назначения . Коммутация Алгоритмы коммутации сравнительно просты и в основном одинаковы для большинства протоколов маршрутизации . В большинстве случаев главная вычислительная машина определяет необходимость отправки пакета в другую главну ю вычислительную машину . Получив определенным способом адрес роутера , главная вычислительная машина-источник отправляет пакет , адресованный специально в физический адрес роутера (уровень МАС ), однако с адресом протокола (сетевой уровень ) главной вычислите л ьной машины пункта назначения . После проверки адреса протокола пункта назначения пакета роутер определяет , знает он или нет , как передать этот пакет к следующему роутеру . Во втором случае (когда роутер не знает , как переслать пакет ) пакет , как правило , иг норируется . В первом случае роутер отсылает пакет к следующей роутеру путем замены физического адреса пункта назначения на физический адрес следующего роутера и последующей передачи пакета . Следующая пересылка может быть или не быть главной вычислительной машиной окончательного пункта назначения . Если нет,то следующей пересылкой , как правило , является другой роутер , который выполняет такой же процесс принятия решения о коммутации . По мере того , как пакет продвигается через объединенную сеть , его физически й адрес меняется , однако адрес протокола остается неизменным . В изложенном выше описании рассмотрена коммутация между источником и системой конечного пункта назначения . Международная Организация по Стандартизации (ISO) разработала иерархическую терминологи ю , которая может быть полезной при описании этого процесса . Если пользоваться этой терминологией , то устройства сети , не обладающие способностью пересылать пакеты между подсетями , называются конечными системами (Е S), в то время как устройства сети , имеющи е такую способность , называются промежуточными системами (IS). Промежуточные системы далее подразделяются на системы , которые могут сообщаться в пределах "доменов маршрутизации " ("внутридоменные " IS), и системы , которые могут сообщаться как в пределах доме н а маршрутизации , так и с другими доменами маршрутизации ("междоменные IS"). Обычно считается , что "домен маршрутизации " - это часть объединенной сети , находящейся под общим административным управлением и регулируемой определенным набором административных р уководящих принципов . Домены маршрутизации называются также "автономными системами " (AS). Для определенных протоколов домены маршрутизации могут быть дополнительно подразделены на "участки маршрутизации ", однако для коммутации как внутри участков , так и м е жду ними также используются внутридоменные протоколы маршрутизации . 2.5. Алгоритмы маршрутизации Алгоритмы маршрутизации можно дифференцировать , основываясь на нескольких ключевых характеристиках . Во-первых , на работу результирующего протокола маршрути зации влияют конкретные задачи , которые решает разработчик алгоритма . Во-вторых , существуют различные типы алгоритмов маршрутизации , и каждый из них по-разному влияет на сеть и ресурсы маршрутизации . И наконец , алгоритмы маршрутизации используют разнообра з ные показатели , которые влияют на расчет оптимальных маршрутов . В следующих разделах анализируются эти атрибуты алгоритмов маршрутизации . Цели разработки алгоритмов маршрутизации При разработке алгоритмов маршрутизации часто преследуют одну или нескольк о из перечисленных ниже целей : 1.Оптимальность 2.Простота и низкие непроизводительные затраты 3.Живучесть и стабильность 4.Быстрая сходимость 5.Гибкость Оптимальность Оптимальность , вероятно , является самой общей целью разработки . Она характеризуе т способность алгоритма маршрутизации выбирать "наилучший " маршрут . Наилучший маршрут зависит от показателей и от "веса " этих показателей , используемых при проведении расчета . Например , алгоритм маршрутизации мог бы использовать несколько пересылок с опре д еленной задержкой , но при расчете "вес " задержки может быть им оценен как очень значительный . Естественно , что протоколы маршрутизации должны строг o определять свои алгоритмы расчета показателей . Простота и низкие непроизводительные затраты Алгоритмы маршрутизации разрабатываются как можно более простыми . Другими словами , алгоритм маршрутизации должен эффективно обеспечивать свои функциональные возможности , с минимальными затратами программного обеспечения и коэффициентом использования . Особенно важна эффективность в том случае , когда программа , реализующая алгоритм маршрутизации , должна работать в компьютере с ограниченными физическими ресурсами . Живучесть и стабильность Алгоритмы маршрутизации должны обладать живучестью . Другими словами , они должны четко функционировать в случае неординарных или непредвиденных обстоятельств , таких как отказы аппаратуры , условия высокой нагрузки и некорректные реализации . Т.к . роутеры расположены в узловых точках сети , их отказ может вызвать значительные проблемы . Ч асто наилучшими алгоритмами маршрутизации оказываются те , которые выдержали испытание временем и доказали свою надежность в различных условиях работы сети . Быстрая сходимость Алгоритмы маршрутизации должны быстро сходиться . Сходимость - это процесс согл ашения между всеми роутерами по оптимальным маршрутам . Когда какое-нибудь событие в сети приводит к тому , что маршруты или отвергаются , или становятся доступными , роутеры рассылают сообщения об обновлении маршрутизации . Сообщения об обновлении маршрутизац и и пронизывают сети , стимулируя пересчет оптимальных маршрутов и , в конечном итоге , вынуждая все роутеры придти к соглашению по этим маршрутам . Алгоритмы маршрутизации , которые сходятся медленно , могут привести к образованию петель маршрутизации или выхода м из строя сети . Гибкость Алгоритмы маршрутизации должны быть также гибкими . Другими словами , алгоритмы маршрутизации должны быстро и точно адаптироваться к разнообразным обстоятельствам в сети . Например , предположим , что сегмент сети отвергнут . Многие алгоритмы маршрутизации , после того как они узнают об этой проблеме , быстро выбирают следующий наилучший путь для всех маршрутов , которые обычно используют этот сегмент . Алгоритмы маршрутизации могут быть запрограммированы таким образом , чтобы они могли а даптироваться к изменениям полосы пропускания сети , размеров очереди к роутеру , величины задержки сети и других переменных . Типы алгоритмов Алгоритмы маршрутизации могут быть классифицированы по типам . Например , алгоритмы могут быть : 1.Статическими или динамическими 2.Одномаршрутными или многомаршрутными 3.Одноуровневыми или иерархическими 4.С интеллектом в главной вычислительной машине или в роутере 5.Внутридоменными и междоменными 6.Алгоритмами состояния канала или вектора расстояний Статически е или динамические алгоритмы Статические алгоритмы маршрутизации вообще вряд ли являются алгоритмами . Распределение статических таблиц маршрутизации устанавливается администратором сети до начала маршрутизации . Оно не меняется , если только администратор с ети не изменит его . Алгоритмы , использующие статические маршруты , просты для разработки и хорошо работают в окружениях , где трафик сети относительно предсказуем , а схема сети относительно проста . Т.к . статические системы маршрутизации не могут реагировать на изменения в сети , они , как правило , считаются непригодными для современных крупных , постоянно изменяющихся сетей . Большинство доминирующих алгоритмов маршрутизации 1990гг . - динамические . Динамические алгоритмы маршрутизации подстраиваются к изменяющи мся обстоятельствам сети в масштабе реального времени . Они выполняют это путем анализа поступающих сообщений об обновлении маршрутизации . Если в сообщении указывается , что имело место изменение сети , программы маршрутизации пересчитывают маршруты и рассыл а ют новые сообщения о корректировке маршрутизации . Такие сообщения пронизывают сеть , стимулируя роутеры заново прогонять свои алгоритмы и соответствующим образом изменять таблицы маршрутизации . Динамические алгоритмы маршрутизации могут дополнять статическ и е маршруты там , где это уместно . Например , можно разработать "роутер последнего обращения " (т.е . роутер , в который отсылаются все неотправленные по определенному маршруту пакеты ). Такой роутер выполняет роль хранилища неотправленных пакетов , гарантируя , ч т о все сообщения будут хотя бы определенным образом обработаны . Одномаршрутные или многомаршрутные алгоритмы Некоторые сложные протоколы маршрутизации обеспечивают множество маршрутов к одному и тому же пункту назначения . Такие многомаршрутные алгоритмы делают возможной мультиплексную передачу трафика по многочисленным линиям ; одномаршрутные алгоритмы не могут делать этого . Преимущества многомаршрутных алгоритмов очевидны - они могут обеспечить значительно большую пропускную способность и надежность . Од ноуровневые или иерархические алгоритмы Некоторые алгоритмы маршрутизации оперируют в плоском пространстве , в то время как другие используют иерархии маршрутизации . В одноуровневой системе маршрутизации все роутеры равны по отношению друг к другу . В иерар хической системе маршрутизации некоторые роутеры формируют то , что составляет основу (backbone - базу ) маршрутизации . Пакеты из небазовых роутеров перемещаются к базовым роутерам и пропускаются через них до тех пор , пока не достигнут общей области пункта н азначения . Начиная с этого момента , они перемещаются от последнего базового роутера через один или несколько небазовых роутеров до конечного пункта назначения . Системы маршрутизации часто устанавливают логические группы узлов , называемых доменами , или авт ономными системами (AS), или областями . В иерархических системах одни роутеры какого-либо домена могут сообщаться с роутерами других доменов , в то время как другие роутеры этого домена могут поддерживать связь с роутеры только в пределах своего домена . В о чень крупных сетях могут существовать дополнительные иерархические уровни . Роутеры наивысшего иерархического уровня образуют базу маршрутизации . Основным преимуществом иерархической маршрутизации является то , что она имитирует организацию большинства комп аний и следовательно , очень хорошо поддерживает их схемы трафика . Большая часть сетевой связи имеет место в пределах групп небольших компаний (доменов ). Внутридоменным роутерам необходимо знать только о других роутерах в пределах своего домена , поэтому их алгоритмы маршрутизации могут быть упрощенными . Соответственно может быть уменьшен и трафик обновления маршрутизации , зависящий от используемого алгоритма маршрутизации . Алгоритмы с интеллектом в главной вычислительной машине или в роутере Некоторые алг оритмы маршрутизации предполагают , что конечный узел источника определяет весь маршрут . Обычно это называют маршрутизацией от источника . В системах маршрутизации от источника роутеры действуют просто как устройства хранения и пересылки пакета , без всякий р аздумий отсылая его к следующей остановке . Другие алгоритмы предполагают , что главные вычислительные машины ничего не знают о маршрутах . При использовании этих алгоритмов роутеры определяют маршрут через объединенную сеть , базируясь на своих собственных р асчетах . В первой системе , рассмотренной выше , интеллект маршрутизации находится в главной вычислительной машине . В системе , рассмотренной во втором случае , интеллектом маршрутизации наделены роутеры . Компромисс между маршрутизацией с интеллектом в главно й вычислительной машине и маршрутизацией с интеллектом в роутере достигается путем сопоставления оптимальности маршрута с непроизводительными затратами трафика . Системы с интеллектом в главной вычислительной машине чаще выбирают наилучшие маршруты , т.к . о н и , как правило , находят все возможные маршруты к пункту назначения , прежде чем пакет будет действительно отослан . Затем они выбирают наилучший маршрут , основываясь на определении оптимальности данной конкретной системы . Однако акт определения всех маршрут о в часто требует значительного трафика поиска и большого объема времени . Внутридоменные или междоменные алгоритмы Некоторые алгоритмы маршрутизации действуют только в пределах доменов ; другие - как в пределах доменов , так и между ними . Природа этих двух типов алгоритмов различная . Поэтому понятно , что оптимальный алгоритм внутридоменной маршрутизации не обязательно будет оптимальным алгоритмом междоменной маршрутизации . Алгоритмы состояния канала или вектора расстояния Алгоритмы состояния канала (извес тные также как алгоритмы "первоочередности наикратчайшего маршрута ") направляют потоки маршрутной информации во все узлы объединенной сети . Однако каждый роутер посылает только ту часть маршрутной таблицы , которая описывает состояние его собственных канал о в . Алгоритмы вектора расстояния ( известные также как алгоритмы Бэллмана-Форда ) требуют от каждог o роутера посылки всей или части своей маршрутной таблицы , но только своим соседям . Алгоритмы состояния каналов фактически направляют небольшие корректировки п о всем направлениям , в то время как алгоритмы вектора расстояний отсылают более крупные корректировки только в соседние роутеры . Отличаясь более быстрой сходимостью , алгоритмы состояния каналов несколько меньше склонны к образованию петель маршрутизации , чем алгоритмы вектора расстояния . С другой стороны , алгоритмы состояния канала характеризуются более сложными расчетами в сравнении с алгоритмами вектора расстояний , требуя большей процессорной мощности и памяти , чем алгоритмы вектора расстояний . Вследств и е этого , реализация и поддержка алгоритмов состояния канала может быть более дорогостоящей . Несмотря на их различия , оба типа алгоритмов хорошо функционируют при самых различных обстоятельствах . Показатели алгоритмов (метрики ) Маршрутные таблицы содержа т информацию , которую используют программы коммутации для выбора наилучшего маршрута . Чем характеризуется построение маршрутных таблиц ? Какова особенность природы информации , которую они содержат ? В данном разделе , посвященном показателям алгоритмов , сдел а на попытка ответить на вопрос о том , каким образом алгоритм определяет предпочтительность одного маршрута по сравнению с другими . В алгоритмах маршрутизации используется много различных показателей . Сложные алгоритмы маршрутизации при выборе маршрута могу т базироваться на множестве показателей , комбинируя их таким образом , что в результате получается один отдельный (гибридный ) показатель . Ниже перечислены показатели , которые используются в алгоритмах маршрутизации : 1.Длина маршрута 2.Надежность 3.Задерж ка 4.Ширина полосы пропускания 5.Нагрузка 6.Стоимость связи Длина маршрута Длина маршрута является наиболее общим показателем маршрутизации . Некоторые протоколы маршрутизации позволяют администраторам сети назначать произвольные цены на каждый канал сети . В этом случае длиной тракта является сумма расходов , связанных с каждым каналом , который был траверсирован . Другие протоколы маршрутизации определяют "количество пересылок ", т.е . показатель , характеризующий число проходов , которые пакет должен совер ш ить на пути от источника до пункта назначения через изделия объединения сетей (такие как роутеры ). Надежность Надежность , в контексте алгоритмов маршрутизации , относится к надежности каждого канала сети (обычно описываемой в терминах соотношения бит /оши бка ). Некоторые каналы сети могут отказывать чаще , чем другие . Отказы одних каналов сети могут быть устранены легче или быстрее , чем отказы других каналов . При назначении оценок надежности могут быть приняты в расчет любые факторы надежности . Оценки надеж н ости обычно назначаются каналам сети администраторами сети . Как правило , это произвольные цифровые величины . Задержка Под задержкой маршрутизации обычно понимают отрезок времени , необходимый для передвижения пакета от источника до пункта назначения чере з объединенную сеть . Задержка зависит от многих факторов , включая полосу пропускания промежуточных каналов сети , очереди в порт каждого роутера на пути передвижения пакета , перегруженность сети на всех промежуточных каналах сети и физическое расстояние , н а которое необходимо переместить пакет . Т.к . здесь имеет место конгломерация нескольких важных переменных , задержка является наиболее общим и полезным показателем . Полоса пропускания Полоса пропускания относится к имеющейся мощности трафика какого-либо к анала . При прочих равных показателях , канал Ethernet 10 Mbps предпочтителен любой арендованной линии с полосой пропускания 64 Кбайт /сек . Хотя полоса пропускания является оценкой максимально достижимой пропускной способности канала , маршруты , проходящие че р ез каналы с большей полосой пропускания , не обязательно будут лучше маршрутов , проходящих через менее быстродействующие каналы . Например , если более быстродействующий канал почти все время занят , то фактическое время , необходимое для отправки пакета в пун к т назначения , для этого быстродействующего канала может оказаться больше . Нагрузка Нагрузка относится к степени занятости какого-либо источника сети (такого , как роутер ). Нагрузка может быть вычислена разнообразными способами , в том числе по коэффициент у использования главного процессора и числу пакетов , обработанных в секунду . Постоянный контроль этих параметров может привести к интенсивному расходованию ресурсов . Стоимость связи Другим важным показателем является стоимость связи . Некоторые компании интересует не столько эффективность , сколько операционные расходы . Даже если задержка в их линии может быть большой , они отправят пакеты через свои собственные линии , а не через линии общего пользования , т.к . им придется платить за использованное время . 3.Сетевые броузеры 3.1. Описание стандартного броузера Просмотр ресурсов в сети Internet обеспечивается специальными программами с графическим интерфейсом – броузерами . Наиболее популярными из них являются Netsca pe Navigator и Microsoft Internet Explorer. В окошке Адрес нужно задать адрес сервера (например , http://www.oldfield.com) и нажать клавишу ENTER. Рис .6. Панель броузера Microsoft Internet Explorer. 3.2. Характеристика существующих систем поиска Рассмотрим наиболее популярные броузеры : Netscape Navigator Version 3.01Gold Copyright © 1996 Netscape Communications Corporation и Microsoft Internet Explorer 4.0 Броузер Netscape Navigator Gold содержи т в себе средство обработки языка JAVA, разработанного фирмой Sun Microsystems, Inc., средства защиты информации , разработанные фирмой RSA Data Security, Inc., поддерживает международный стандарт защиты с RSA Public Key Cryptography, MD2, MD5, RC2-CBC, RC 4., а также содержит QuickTimeTM plug-in, разработанный фирмой Apple Computer, Inc., который служит для просмотра фильмов в стандарте QuickTime. Данный броузер может также служить для просмотра файлов различных форматов : multimedia файлы , текстовые файлы, и , конечно HTML- файлы , при этом выполняя работу примитивного файл-менеджера. Netscape Navigator имеет удобный настраиваемый интерфейс , уже ставший стандартом для броузеров : в его основе лежит панель с кнопками BACK, FORWARD, HOME, RELOAD, IMAGES, FIND, S TOP , строка для ввода WWW и FTP адресов и окно для просмотра WEB – страниц , файлов и FTP – каталогов . Главное его отличие от предыдущих версий – наличие редактора HTML – файлов . Большим удобством Netscape в отличие от IE является то , что bookmarks ( «заклад ки»-список понравившихся пользователю WEB- страниц ) является обычным HTML- файлом , простым для редактирования и копирования , а также то , что cache для файлов из Internet является обычным каталогом с набором файлов , доступных для копирования и редактирования. Специализация Netscape – разработка программ для сетей и , наверное поэтому Netscape Navigator ( в следующей версии – Netscape Communicator) является , на мой взгляд , наиболее удачным броузером. Корпорация Microsoft осталась верна своим традициям заимствоват ь все самое лучшее у своих конкурентов и затем интегрировать все в единое целое – операционную систему MS-Windows. Впервые Microsoft встроила Internet Explorer в Windows-95 OSR/2 – Microsoft Internet Explorer , где сам Explorer был практически полностью сри сован с программы Netscape Navigator. Рассмотрим более подробно IE 4.0 , выпущенный 30 сентября 1997 года. С этой программой компания связывала очень большие надежды – отвоевать более половины рынка броузеров . В течение 48 часов после того , как на WEB- сайт ах во всем мире был открыт доступ к пакету , было скопировано более 1 млн . экземпляров программы – рекордное для Microsoft количество . Более 50 ведущих производителей ПК , в том числе COMPAQ, HP, DELL, DIGITAL , будут предустанавливать пакет на свои системы . 14 крупнейших провайдеров Internet в США изъявили желание инсталлировать Internet Explorer 4.0 своим клиентам. Internet Explorer 4.0 – это не просто автономный броузер , а целый интегрированный комплект программ , позволяющих не только просматривать страничк и , хранящиеся на WWW- серверах , а и общаться пользователям друг с другом , осуществлять совместный доступ к информации , разрабатывать собственные странички , использовать Internet для успешного ведения бизнеса . В полной версии Internet Explorer 4.0 содержит , помимо броузера , следующие программы : Outlook Express – клиент электронной почты и новостей ; NetMeeting – программа для групповой работы в Internet; Microsoft Chat – программа для ведения электронных бесед ; FrontPage Express – редактор HTML с набором базо вых функций ; Web Publishing Wizard – “ волшебник ” для копирования пользовательских WEB- страниц на серверы Internet. Если Netscape «поднимает на щит» способность своего продукта работать на самых различных аппаратных платформах и в операционных системах (в сумме 15 версий ), то Microsoft поставила во главу угла теснейшую интеграцию броузерах самыми популярными пользовательскими ОС – Windows ’ 95 и NT. Правда , ожидается выпуск Internet Explorer 4.0 для Macintosh, Windows 3.x и Unix, но , естественно без интеграци и в эти ОС . Важным козырем Microsoft является то , что Internet Explorer 4.0 можно загрузить с серверов компании и ее партнеров совершенно бесплатно , в то время как для Netscape Communicator это возможно только на время апробирования (стоимость пакета сост авляет $ 39 за базовую версию и $ 79 за версию Professional). Инсталляция пакета : Internet Explorer 4.0 доступен в трех вариантах : только как броузер с мультимедиа-приложениями (объем 13 М B); как стандартный комплект , включающий также Outlook Express (16 M B); как полный комплект , в который добавлены все остальные компоненты (25 MB). Сначала с сервера Internet копируется небольшая программа установки . После ее запуска будут предложены два варианта : продолжать инсталляцию в режиме on-line (Active Setup) или только копировать необходимые файлы . В случае обрыва связи при соединении по коммутируемой телефонной линии можно запустить программу установки в режиме Repair, при этом будут копироваться только недостающие файлы (возможности «докачки» файлов так и не реа лизованы ). Броузер : броузер Internet Explorer 4.0 в полном объеме использует все преимущества новых возможностей языка описания страниц HTML и имеет множество усовершенствований , касающихся пользовательского интерфейса и удобства WEB- серфинга . Среди них – возможности гибкой настройки инструментов , поддержка drag-and-drop , автоматическое завершение URL (достаточно набрать несколько букв , и если этот сервер посещался , его название будет автоматически дописано ), гибкий контроль над безопасностью . Также поддерж ивается автоматическое обновление пакета и его компонентов. Главная тенденция в развитии существующей версии стандарта HTML – это добавление динамики к статическому содержимому большинства WWW- пространства . Если недавно для этих целей на первый план выходи ли языки JAVA и JavaScript, то сегодня “последний писк” – это динамический HTML , позволяющий изменять внешний вид страниц и информацию , которая на них хранится , после того , как страница загружена с сервера . Динамический HTML предоставляет следующие возможн ости : динамические стили – изменение цвета , начертания и форматирования объектов на странице ; динамическое содержимое – изменение текста , изображений или мультимедиа-элементов ; позиционирование – передвижение текста , изображений и прочих объектов на стран ице , расположение их в нескольких уровнях ; работа с данными – поддержка форм ввода , сбор необходимых данных и получение результатов. К сожалению , реализации динамического HTML Microsoft и Netscape являются несовместимыми , и какая из них станет стандартом , будет известно позднее. После установки броузер Internet Explorer 4.0 становится как бы частью операционной системы , замещая классический Windows Explorer в Windows ’ 95 , являясь , таким образом , программой просмотра как содержимого локального компьютера , так и сети WWW. В версии Windows ’ 98 такая технология уже стала стандартной . Усовершенствования интерфейса Windows были названы Active Desktop (кстати , установка их является опциональной ). Active Desctop позволяет выкладывать на поверхность Рабочего Стола как традиционные пиктограммы , так и элементы в формате HTML (WEB-страницы , дисковые подкаталоги , компоненты ActiveX или JAVA). После установки Internet Explorer 4.0 в меню Start появляется пункт Favorites, а в подменю Search – пункты On The Internet (поиск инф ормации в сети ) и People ( поиск личной информации о людях ). Рядом с кнопкой Start на панели задач появляется миниатюрная панель инструментов , содержащая кнопки быстрого доступа к наиболее часто используемым функциям. Каждый компонент Internet Explorer 4.0 содержит большие возможности настройки . К примеру , в броузере Internet Explorer 4.0 можно указать , какие Mail- и News- клиенты , а также какой редактор HTML следует использовать по умолчанию. Очень удобной является возможность делить окно просмотра на два ( Explorer Bars) и в левом отображать список ссылок Favorites , историю посещения серверов , результаты поиска или список Push- каналов . К примеру , когда в левом окне представлены результаты поиска , в правом можно в это время просматривать информацию по интерес ующим ссылкам. Мультимедиа – компоненты , входящие в комплект , включают в себя программы Microsoft NetShow, RealPlayer от компании Progressive Networks и VDOLive от VDONet. В Internet Explorer 4.0 JAVA работает значительно быстрее , чем в Netscape Communicat or. Практически целиком поддерживаются спецификации Java Development Kit 1.1, в том числе Abstract Windowing Toolkit (AWT) и Java Beans. Что касается безопасности работы , то Microsoft предложила концепцию так называемых зон безопасности ( Security Zones). П ользователь может классифицировать серверы Internet по «уровню доверия» к ним : Local Intranet, Trusted Sites, Internet и Restricted Sites. Допустимо назначать разные «уровни доверия» к серверам из различных групп . Также представлена возможность полностью отключить JAVA, ActiveX и Cookies. Функция Internet Advisor позволяет системным администраторам и , в случае домашнего использования , родителям , запрещать доступ к определенным серверам. Еще одно удобное усовершенствование касается печати – теперь страницу с фреймами можно печатать либо целиком , либо выбрать только фрейм , который требуется. Push – технология : идея Push – технологии состоит в том , чтобы провайдеры информационных услуг пересылали информацию клиентам сами , без какого-либо вмешательства со сто роны последних (если , разумеется , клиент подписался на данный информационный канал ). Затем пользователь может читать эту информацию в режиме off-line, т.е . не подключаясь к сети . В Internet Explorer 4.0 предусмотрена возможность указывать , как часто следует производить обновление данных из определенного канала и какой объем информации разрешено копировать на локальной компьютер. После установки пакета на Рабочем Столе появляется панель Channels , с помощью которой можно быстро осуществлять доступ к инт ересующим каналам и подписываться на них. Электронная почта и новости : в пакет входит программа Outlook Express – POP3 и IMAP4- совместимый почтовый клиент , способный работать с сообщениями в формате HTML , а также программа работы с телеконференциями по пр отоколу NNTP. Трехпанельный интерфейс в Outlook Express очень гибко настраивается . Программа позволяет помещать в один почтовый ящик сообщения с нескольких POP3- и IMAP4- серверов . Можно сортировать входящую почту по определенным правилам в различные папки , удаляя при этом поступающий “почтовый мусор” . Программа Outlook Express импортирует почтовые ящики и адресные книги из популярных клиентов электронной почты . С ее помощью создаются сообщения электронной почты в формате HTML, при этом в адресной книге ука зывается , кому из респондентов разрешено отправлять сообщения в таком формате , а кому – нет. Средства групповой работы : В Microsoft NetMeeting включены поддержка аудио - и видеоконференций , Whiteboard, ведение электронных бесед в режиме реального времени ( chat) и обмен файлами . В chat или Whiteboard одновременно могут учавствовать несколько пользователей , хотя в аудиоконференции – только два . Поддерживается кодек формата G.723 для соединения на низких скоростях , совместимый с продуктами многих производителе й . Видеоконференции можно проводить как в пределах локальной сети , так и с использованием связи по низкоскоростным аналоговым линиям. Совместный доступ к приложениям ( Application sharing) дает возможность пользователям на различных компьютерах редактироват ь документ , даже если на одном из них нет необходимой программы текстового редактора . Доступен также совместный просмотр ресурсов WWW с общим окном броузера и курсором. FrontPage Express : пакет содержит редактор страниц HTML под названием FrontPage Express, в который включены базовые функции редактирования для создания простых WEB- страниц . Также имеется Web Publishing Wizard, инструмент для загрузки WEB- страниц на удаленный сервер. Также следует отметить броузер норвежской фирмы Opera Sof tware AS, принадлежащий к классу shareware- продуктов. Чем привлекает к себе внимание Opera Browser , так это чрезвычайно малым размером размером инсталляционного пакета – всего 1 MB в 32-разрядной версии для Windows 95 / NT 4.0 и 1,12 MB в 16-разрядной верс ии для Windows 3.x / NT 3.51 . Требования программы к ресурсам ПК довольно лояльны : Opera нормально работает на 386SX с 6 MB RAM, занимая на жестком диске около 2 МВ , из которых почти 400 КВ отводится справочной системе. Opera очень быстро стартует (приме рно в 4 – 5 раз быстрее , чем Netscape или MSIE ), а работать с этим броузером приятно хотя бы потому , что все функции просты , понятны и быстроосваиваемы . Наверное , в этом его главное отличие от WWW- клиентов , имеющих довольно сложные настройки . Тем не менее, Opera поддерживает JavaScript, SSL 3.0, Netscape plugins и распространенные графические форматы. Открытие новых окон в Opera – это не создание очередных копий броузера , а действительно открытие окон в том же приложении. Hot-list – список адресных закладок в Opera, имеет двухуровневую структуру . Запоминание Web- ссылок не столь удобно , как в Netscape Navigator, но интересно , что имя каждой закладки в списке определяется самим пользователем и может хранить до шести адресов Web- страниц . Если вы работаете однов ременно с несколькими HTML – документами в разных окнах программы , то нажатием одной кнопки Add All в меню редактирования закладки можно запомнить ссылки на все из них . В дальнейшем , при выборе пользователем такой множественной закладки , броузер открывает сразу все шесть окон , в каждом из которых отрабатывается своя ссылка. В Opera также есть функция , облегчающая чтение документов – масштабирование . Она доступна даже в процессе загрузки документов через пиктограмму в Progress Bar или клавиши « + » (+10 %) и « -» (-10%). Система горячих клавиш в броузере хорошо продумана и позволяет осуществлять навигацию в документах практически без помощи мыши. Кроме того , в строке Progress имеются полезные информационные окна , сообщающие о состоянии процесса загрузки Web- стра ниц (скорость передачи данных , загруженное и общее количество текста и графических элементов , время загрузки ). Адрес Opera в Web : http://www.operasoftware.com Кроме того , существует класс программ , называемых off-line- броузерами (или web-spider ’ ами ). Они помогают в ситуациях , когда нужно сохранить Web- страницу целиком , со всеми изображениями , которые на ней расположены . Программа Teleport Pro компании Tennyson Maxwell Information Systems ( http://www.tenmax.com ) как раз и есть пример такого броузера . Она п озволяет копировать на локальный жесткий диск одиночные страницы или целые деревья страниц со всей встроенной графикой , звуковыми и анимационными файлами , а затем , отключившись от сети , просматривать полученную информацию без необходимости связываться с с е рвером . Таким образом , Teleport Pro существенно сокращает время сеанса связи , поскольку нет нужды читать в on-line содержимое страниц и заниматься их сохранением вручную . Teleport Pro способен работать через proxy- и firewall- серверы. 3.3. Особенности соз дания поисковых систем в визуальных средах программирования Интегрированная среда разработки Delphi (Integrated Development Environment) – IDE включает в себя несколько основных элементов . Пиктограммы ( Speed Buttons) . Это пиктографические кнопки , дублиру ющие некоторые команды меню . Наименование каждой пиктограммы можно получить прямо на экране в маленьком окне контекстной подсказки , которая появляется , если указатель мыши задержать на некоторое время на изображении соответствующей пиктограммы . Главное ме ню ( Menu Bar) . Это стандартное меню в стиле Windows. Возле большинства команд меню в Delphi 4 изображены пиктограммы . Это те же самые пиктограммы , что и на панели инструментов. Палитра компонентов ( Component Palette) . Здесь представлены пиктограммы компоне нтов , которые включены в библиотеку VCL . Получить информацию об имени компонента , который «скрывается» за той или иной пиктограммой , можно тем же способом , который применяется для пиктограмм на панели инструментов. Категории палитры. В каждый момент времен и в поле палитры открыта только одна категория компонентов. Вкладки свойств и событий. Если щелкнуть мышью на одной из двух вкладок диалогового окна инспектора объектов Object Inspector , откроется либо вкладка свойств ( Properties) объектов компонентов , вкл юченных в экранную форму , либо вкладку событий ( Events) объектов компонентов . Свойства описывают атрибуты объекта – размер кнопки или шрифт текстовой этикетки . События же представляют некоторые действия , например , щелчок на кнопке или нажатие клавиши. Инсп ектор объектов ( Object Inspector) . Это диалоговое окно отображает списки всех свойств и событий одного или более объектов компонентов , выбранных в проектируемой экранной форме. Окно проектирования экранной формы ( Form window) . При разработке большинства пр ограмм экранная форма является визуальным представлением главного окна приложения . Точечная сетка на поле проектирования формы помогает выбрать точное место установки и выровнять их. Диалоговое окно Module Explorer . Это новое средство , которое включено в в ерсию Delphi 4 . Окно Module Explorer выводит информацию о текущем программном модуле – перечень классов , список других модулей , которые он использует , переменных , объектов , методов и т.д . Редактор кода программы (Code editor window). В этом окне можно просматривать и редактировать текст программы на языке Pascal , связанной с любой экранной формой разрабатываемого приложения . Большинство рутинных фрагментов кода – объявления и заготовки процедур обработки событий – Delphi вставляет в программу автоматиче ски . После этого от обработчика требуется наполнить «полуфабрикат» содержанием – включить необходимые операторы и выражения Pascal, которые , собственно , и определяют поведение программы в той или иной ситуации , например , щелчок мышью или выбор команды меню. Приложения для работы в Internet Редакция Client-Server Delphi поставляется вместе с полным набором средств поддержки и создания приложений для работы с Internet и Intranet. Эти компоненты весьма полезны не только для получения доступа к всевозможным сл ужбам и ресурсам Internet и Intranet, но и для создания средств программного обеспечения удаленного доступа к базам данных . Например , корпорация Inprise использует компоненты Delphi при создании приложений , накапливающих информацию о сбоях программ. Компо ненты Internet Delphi предлагает целый набор компонентов для программирования в Internet и Intranet. Эти компоненты не имеют визуальных изображений времени прогона и появляются как пиктограммы в форме окон . Все компоненты являются элементами управления Ac tiveX , встроенными в упаковщики компонентов Delphi. Ниже приведены компоненты управления Internet ActiveX в порядке их расположения на экране. FTP (Internet File Transfer Protocol). Пересылает файлы и данные между локальным компьютером и клиентом. HTML (Hy pertext Markup Language). Поддерживает просмотр документов формата HTML. Также может использоваться для синтаксического анализа команд HTML. HTTP (Hypretext Transport Protocol). Извлекает документы в формате HTTP без предварительного просмотра и возможност и обработки изображений. NNTP (Network News Transport Protocol). Поддерживает чтение и отправку новостей. POP (Post Office Protocol). Поддерживает почтовую службу UNIX или других серверов , соответствующих стандарту POP3. SMTP (Simple Mail Transfer Protocol ). Обеспечивает доступ к почтовым сервером SMTP. TCP (Transmission Control Protocol). Поддерживает протокол TCP для приложений класса клиент /сервер. Приложения Delphi для Internet Для формирования средств доступа к HTML – документам через Internet достато чно поместить компонент HTML в экранную форму и создать процедуру обработки события , которая будет вызывать метод RequestDoc этого компонента , как показано ниже : HTML1.RequestDoc(URLs.text); Предполагается , что параметр URLs является объектом ComboBox или каким-то другим компонентом , имеющим свойство text. Из указанного диапазона объектов параметру URL может быть назначен любой объект . Компоненту RequestDoc можно передать и параметр-строку : HTML1.RequestDoc( ‘ www.inprise.com ’ ); Объекты компонента HTML весь ма полезны для получения доступа к исходным текстовым данным HTML – документов . С этой целью нужно связаться с узлом , вызвав метод компонента RequestDoc. В результате будет получен доступ к свойству SourceText HTML – документа , которое представляет собой п острочный список с «сырым» текстом документа . Предлагаемый вместе с Delphi демонстрационный Web – броузер использует свойство SourceText для того , чтобы показать в окне исходный HTML – документ , добавляя при этом текст в окно редактора Memo. Можно использо вать такое выражение : Memo1.Lines.Clear; Memo1.Lines.Add (HTML1.SourceText); Есть два события компонента HTML, очень полезных для определения моментов начала и окончания поиска и выбора документа . Сначала нужно выбрать объект HTML и щелкнуть на вкладке Ev ents окна Object Inspector. Затем нужно дважды щелкнуть в строках событий OnBeginRetrieval и OnEndRetrieval, чтобы Delphi сформировала заготовки процедур обработки каждого из них. 4.Программная реализация 4.1.Архитектура системы “Бр оузер” Модель броузера , представленная в данной дипломной работе , предоставляет следующие возможности : - Загрузка Web- страниц ; - Операции по отправке и получению почты ; - Обмен файлами по протоколу FTP; - Возможность обмена символьной информацией между дву мя удаленными компьютерами , на которых должен быть запущен данный броузер. Броузер написан на языке Borland Delphi 3.0. Рис .7. Панель демонстрационного броузера. 4.2.Основные процедуры броузера WWW- сер вис : procedure TMainForm.Exit1Click – осуществляет выход из программы ; procedure TMainForm.FindAddress – запрашивает HTML- файл по указанному адресу ; procedure TMainForm.DocumentSource1Click – выводит исходный текст полученного HTML- файла ; procedure TMainFo rm.StopBtnClick – останавливает загрузку HTML- файла ; procedure TMainForm.RefreshBtnClick – перегружает последний полученный HTML- файл ; procedure TMainForm.BackBtnClick – вызывает предыдущий загруженный HTML- файл ; procedure TMainForm.ForwardBtnClick – вызыв ает последующий загруженный HTML- файл ; procedure TMainForm.ToolButton2Click – загружает объект TMail, ответственный за отправку и получение почты ; procedure TMainForm.ToolButton3Click – загружает объект TMyFtp, ответственный за обмен данных в протоколе FTP ; procedure TMainForm.ToolButton4Click – загружает объект TNewsForm, ответственный за получение и отправку новостей ; procedure TMainForm.ToolButton9Click – загружает объект TChatForm, ответственный за обмен символьной информацией между двумя удаленными ком пьютерами ; FTP- сервис : procedure TMyFtp.ConnectBtnClick – соединяется с указанным FTP- сервером ; procedure TMyFtp.Disconnect – обрывает соединение с FTP- сервером ; procedure TMyFtp.CopyItemClick – выполняет копирование выбранного файла с FTP- сервера ; procedure TMyFtp.PasteFromItemClick – отсылает файл на FTP- сервер ; Chat- сервис : procedure TChatForm.FileConnectItemClick – выполняет запрос адреса компьютера , с которым будет происходить обмен символльной информацией ; procedure TChatForm.Memo1KeyDown – считывание символа с клавиатуры и отправка его в сокет клиента ; procedure TChatForm.Disconnect1Click – разрывает соединение с удаленным компьютером ; procedure TChatForm.ClientSocketRead – считывание информации с удаленного компьютера ; News- сервис : procedure TNewsForm.FileConnectItemClick – выполняет соединение с сервером новостей ; procedure TNewsForm.FileDisconnectItemClick – разрывает соединение с сервером новостей ; procedure TNews Form.NNTP1DocOutput – вывод групп новостей ; Mail- сервис : procedure TMail.CreateHeaders – создает заголовок для почтового сообщения ; procedure TMail.SendMessage – отправляет сообщение ; procedure TMail.SendFile – отправляет файл , “привязанн ый” к письму ; procedure TMail.SMTP1DocInput – ввод текста почтового сообщения ; procedure TMail.SMTPConnectBtnClick – выполняет соединение с почтовывм сервером ; 4.3.Архитектура имитационной модели глобальной сети Имитационная модель гло бальной корпоративной сети имитирует пересылку пакета от одного компьютера к другому . При запуске программы на экране возникает схема сети , показанная на рисунке 8. Затем , при нажатии клавиши ENTER, программа переходит в текстовый режим с UNIX- подобным ин терфейсом , запрашивая пользователя адрес получателя , адрес отправителя , и данные типа “ String” . Затем каждый компьютер или маршрутизатор , по которому проходит пакет , выводит на экран сообщение о приеме и дальнейшей отправке пакета адресату и время , в котор ое он получил и отправил пакет . Оптимальный маршрут рассчитывается на основе усовершенствованного алгоритма Форда-Беллмана . Программа написана на языке Object Pascal 7.0. Рис .8. Схема глобальной корпоратив ной сети. 4.4.Основные процедуры имитационной модели Типы данных и переменные основной подпрограммы : const AdjacencyMatrix : array[1..VertexQuantity,1..VertexQuantity] of byte =( (0,1,0,1,0,0,0), (1,1,1,0,1 ,0,1), (0,1,0,1,0,0,0), (1,0,1,0,1,0,0), (0,1,0,0,1,1,0), (0,0,0,0,1,0,1), (0,1,0,0,0,1,0) ) – матрица смежности маршрутизаторов ; TYPE TAddr = record router:byte; domain:byte; comp :byte; END - адрес компьютера , состоящий из номера маршрутизатора , номера области данного маршрутизатора и номера компьютера в этой области ; TYPE TBatch = record from:TAddr; to_ :TAddr; data:string; path:array[1..20] of byte; path is chain of router numbers END – пакет , состоящий из адреса отправителя , адреса получателя , данных и пути следования пакета ; TYPE TComp = object - модель компьютера , состоящая из адреса , ячейки памяти для получения или пересылки пакета ; addr:TAddr; mem :TBatch; Procedure Send2Router(batch:TBatch) – процедура посылки пакета на маршрутизатор ; Procedure Send(batch:TBatch) – процедура посылки пакета вн утри своей сети ; Procedure Receive(batch:TBatch;byRouter:boolean) – прием пакета ; END; TYPE TRouter = object - модель маршрутизатора , состоящая из номера маршрутизатора , его координат , и ячейки памя ти ; num :byte; x,y :integer; memory :Tbatch; state :boolean; VAR computers : array[1..38] of TComp - массив компьютеров глобальной сети ; routers : array[1..7] of TRouter – массив маршрутизаторов ; OptimalPath : array[1..49] of byte – оптимальный путь , рассчитанный маршрутизатором ; Procedure Receive(routerNum:byte;batch:TBatch) – прием пакета ; Procedure Send2Comp(batch:TBatch) – отправка пакета в своей сети ; Procedure CalcMinPath(sender,target:byte) – вычисление оптимального пути отправки ; Procedure Send2NextRouter(batch:TBatch;currentRouter:byte) – отправка на следующий маршрутизатор ; END; Заключение В данной дипломной работе был получен следующий результат : 1.) Разработана модель сетевого броузера и корпоративной среды ; 2.) Создана имитационная модель распределения информации в глобальных сетях. 3.) Написано соответствующее программное обеспечение – сетевой броузер с возможностью доступа как к WWW- протоколу , так и к сервису FTP, почтовому сервису SMTP, а также воз можностью обмена символьной информацией между двумя компьютерами в ON-LINE режиме – CHAT и математическая модель корпоративной сети , имитирующая передачу информации в глобальной среде , в которой реализован разработанный усовершенствованный алгоритм поиска оптимального пути между маршрутизаторами. Список литературы : 1. Блэк Ю . Сети ЭВМ : протоколы , стандарты , интерфейсы . М .:Мир ,1990. – 506 с. 2. Донской В.И . Компьютерные сети и сетевые технологии .- Симферополь : Таврида ,1999. – 135 с. 3. Калверт Ч . Delphi 4. Самоучитель . – К .: ДиаСофт , 1999. – 192 с. 4. Крамлиш К . Азбука Internet. К .:Юниор , 1998. – 336 с. 5. Нанс Б . Компьютерные сети . М .:Бином , 1996. – 400 с. 6. Нотон П ., Шилдт Г . Полный справочник по Java . – К .: Диалектика ,1997. – 450 с . 7. Сван Т. Delphi 4 – “ Библия ” разработчика . – К .: Диалектика ,1998. – 500 с. 8. Яблонский С.В . Введение в дискретную математику . – М .: Наука ,1986. – 384 с. 9. Журнал «Компьютерное Обозрение» , N36 (109) ‘ 97, N44 (117) ‘ 97 Приложение 1. Исходный текст программы “броузер” файл main.pas unit Main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Menus, ComCtrls, OleCtrls, Buttons, ToolWin, Isp3; const CM_HOMEPAGEREQUEST = WM_USER + $1000; type TMainForm = class(TForm) StatusBar1: TStatusBar; MainMenu1: TMainMenu; File1: TMenuItem; Exit1: TMenuItem; View1: TMenuItem; DocumentSource1: TMenuItem; NavigatorImages: TImageList ; NavigatorHotImages: TImageList; LinksImages: TImageList; LinksHotImages: TImageList; CoolBar1: TCoolBar; ToolBar1: TToolBar; BackBtn: TToolButton; ForwardBtn: TToolButton; StopBtn: TToolButton; RefreshBtn: TToolButton; URLs: TComboBox; HTML1: THTML; Help1: TMenuItem; About1: TMenuItem; N1: TMenuItem; Toolbar3: TMenuItem; Statusbar2: TMenuItem; ToolButton1: TToolButton; ToolButton2: TToolButton; ToolButton3: TToolButton; ToolButton4: TToolButton; ToolButton9: TToolButton; SpeedButton1: TSpeedButton; Animate1: TAnimate; procedure Exit1Click(Sender: TObject); procedure About1Click(Sender: TObject); procedure DocumentSource1Click(Sender: TObject); procedure StopBtnClick(Sender: TObject); procedure HTML1BeginRetrieval(Sender: TObject); procedure HTML1EndRetrieval(Sender: TObject); procedure URLsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormCreate (Sender: TObject); procedure LinksClick(Sender: TObject); procedure RefreshBtnClick(Sender: TObject); procedure BackBtnClick(Sender: TObject); procedure ForwardBtnClick(Sender: TObject); procedure HTML1DoRequestDoc(Sender: TObject; cons t URL: WideString; const Element: HTMLElement; const DocInput: DocInput; var EnableDefault: WordBool); procedure FormDestroy(Sender: TObject); procedure URLsClick(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Wor d; Shift: TShiftState); procedure Toolbar3Click(Sender: TObject); procedure Statusbar2Click(Sender: TObject); procedure ToolButton2Click(Sender: TObject); procedure ToolButton3Click(Sender: TObject); procedure ToolButton4Click(Sender: TObject); procedure ToolButton9Click(Sender: TObject); private HistoryIndex: Integer; HistoryList: TStringList; UpdateCombo: Boolean; procedure FindAddress; procedure HomePageRequest(var mess age: tmessage); message CM_HOMEPAGEREQUEST; end; var MainForm: TMainForm; implementation uses DocSrc, About, SMTP, FTP, NNTP, CHAT; $R *.DFM procedure TMainForm.Exit1Click(Sender: TObject); begin Close; end; procedure TMainForm.FindAddress; begin HTML1.RequestDoc(URLs.Text); end; procedure TMainForm.About1Click(Sender: TObject); begin ShowAboutBox; end; procedure TMainForm.DocumentSource1Click(Sender: TObject); begin with DocSourceFrm do begin Show; Memo1.Lines.Clear; Me mo1.Lines.Add(AdjustLineBreaks(HTML1.SourceText)); Memo1.SelStart := 0; SendMessage(Memo1.Handle, EM_ScrollCaret, 0, 0); end; end; procedure TMainForm.StopBtnClick(Sender: TObject); begin HTML1.Cancel('Cancel'); HTML1EndRetrieval(nil); end; procedure TMainForm.HTML1BeginRetrieval(Sender: TObject); begin Turn the stop button dark red StopBtn.ImageIndex := 4; Play the avi from the first frame indefinitely Animate1.Active := True; end; procedure TMainForm.HTML1EndRetrieval(Send er: TObject); begin Turn the stop button grey StopBtn.ImageIndex := 2; Stop the avi and show the first frame Animate1.Active := False; end; procedure TMainForm.URLsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if K ey = VK_Return then begin UpdateCombo := True; FindAddress; end; end; procedure TMainForm.URLsClick(Sender: TObject); begin UpdateCombo := True; FindAddress; end; procedure TMainForm.LinksClick(Sender: TObject); begin if (Sender as TToolButton).Hint = '' then Exit; URLs.Text := (Sender as TToolButton).Hint; FindAddress; end; procedure TMainForm.RefreshBtnClick(Sender: TObject); begin FindAddress; end; procedure TMainForm.BackBtnClick(Sender: TObject); begin URLs.Text := HistoryList[HistoryIndex - 1]; FindAddress; end; procedure TMainForm.ForwardBtnClick(Sender: TObject); begin URLs.Text := HistoryList[HistoryIndex + 1]; FindAddress; end; procedure TMainForm.HTML1DoRequestDoc(Sender: TObject; const URL: WideString; const Element: HTMLElement; const DocInput: DocInput; var EnableDefault: WordBool); var NewIndex: Integer; begin NewIndex := HistoryList.IndexOf(URL); if NewIndex = -1 then begin Remove entries in HistoryList betwee n last address and current address if (HistoryIndex >= 0) and (HistoryIndex < HistoryList.Count - 1) then while HistoryList.Count > HistoryIndex do HistoryList.Delete(HistoryIndex); HistoryIndex := HistoryList.Add(URL); end else HistoryIndex := NewIndex; if HistoryList.Count > 0 then begin ForwardBtn.Enabled := HistoryIndex < HistoryList.Count - 1; BackBtn.Enabled := HistoryIndex > 0; end else begin ForwardBtn.Enabled := False; BackBtn.Enabled := Fal se; end; if UpdateCombo then begin UpdateCombo := False; NewIndex := URLs.Items.IndexOf(URL); if NewIndex = -1 then URLs.Items.Insert(0, URL) else URLs.Items.Move(NewIndex, 0); end; URLs.Text := URL; Statusbar1.Panels[0].Text := URL; end; procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Shift = [ssAlt] then if (Key = VK_RIGHT) and ForwardBtn.Enabled then ForwardBtn.Click else if (Key = V K_LEFT) and BackBtn.Enabled then BackBtn.Click; end; procedure TMainForm.Toolbar3Click(Sender: TObject); begin with Sender as TMenuItem do begin Checked := not Checked; Coolbar1.Visible := Checked; end; end; procedure TMainForm.Statusbar2Click(Sender: TObject); begin with Sender as TMenuItem do begin Checked := not Checked; StatusBar1.Visible := Checked; end; end; procedure TMainForm.HomePageRequest(var Message: TMessage); begin URLs.Text := ' http://www.altavista.com'; UpdateCombo := True; FindAddress; end; procedure TMainForm.FormCreate(Sender: TObject); begin HistoryIndex := -1; HistoryList := TStringList.Create; Load the animation from the AVI file in the startup directory. An alternative to this would be to create a .RES file including the cool.avi as an AVI resource and use the ResName or ResId properties of Animate1 to point to it. Animate1.FileName := ExtractFilePath(Application.ExeName) + 'cool.avi'; Find the home page - needs to be posted because HTML control hasn't been registered yet. PostMessage(Handle, CM_HOMEPAGEREQUEST, 0, 0); end; procedure TMainForm.FormDestroy(Sender: TObject); begin HistoryList.Free; end; procedure TMainForm.Too lButton2Click(Sender: TObject); begin TMail.create(Application).showmodal; end; procedure TMainForm.ToolButton3Click(Sender: TObject); begin TMyFtp.create(Application).showmodal; end; procedure TMainForm.ToolButton4Click(Sender: TObject); begin TNe wsForm.create(Application).showmodal; end; procedure TMainForm.ToolButton9Click(Sender: TObject); begin TChatForm.create(Application).showmodal; end; end. файл chat.pas unit chat; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, Buttons, ScktComp, ExtCtrls, ComCtrls; type TChatForm = class(TForm) MainMenu1: TMainMenu; File1: TMenuItem; Exit1: TMenuItem; FileConnectItem : TMenuItem; FileListenItem: TMenuItem; StatusBar1: TStatusBar; Bevel1: TBevel; Panel1: TPanel; Memo1: TMemo; Memo2: TMemo; N1: TMenuItem; SpeedButton1: TSpeedButton; Disconnect1: TMenuItem; ServerSocket: TServerSocket; ClientSocket: TClientSocket; procedure FileListenItemClick(Sender: TObject); procedure FileConnectItemClick(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure Memo1KeyDown(Sender: TObject ; var Key: Word; Shift: TShiftState); procedure FormCreate(Sender: TObject); procedure ServerSocketError(Sender: TObject; Number: Smallint; var Description: string; Scode: Integer; const Source, HelpFile: string; HelpContext: Inte ger; var CancelDisplay: Wordbool); procedure Disconnect1Click(Sender: TObject); procedure ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocketAccept(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket); proce dure ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure ServerSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); protected IsServer: Boolean; end; var ChatForm: TChatForm; Server: String; implementation $R *.DFM procedure TChatForm.FileListenItemClick(Sender : TObject); begin FileListenItem.Checked := not FileListenItem.Checked; if FileListenItem.Checked then begin ClientSocket.Active := False; ServerSocket.Active := True; Statusbar1.Panels[0].Text := 'Listening...' end else begin i f ServerSocket.Active then ServerSocket.Active := False; Statusbar1.Panels[0].Text := ''; end; end; procedure TChatForm.FileConnectItemClick(Sender: TObject); begin if ClientSocket.Active then ClientSocket.Active := False; if InputQuery('Computer to connect to', 'Address Name:', Server) then if Length(Server) > 0 then with ClientSocket do begin Host := Server; Active := True; end; end; procedure TChatForm.Exit1Click(Sender: TObject); begin ServerSocket.Close; ClientSocket.Close; Close; end; procedure TChatForm.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_Return then if IsServer then ServerSocket.Socket.Connections[0].SendText( Memo1.Lines[Memo1.Lines.Count - 1]) else ClientSocket.Socket.SendText(Memo1.Lines[Memo1.Lines.Count - 1]); end; procedure TChatForm.FormCreate(Sender: TObject); begin FileListenItemClick(nil); end; procedure TChatForm.ServerSocketError(Sender: TObject; Number: Smallint; var Description: string; Scode: Integer; const Source, HelpFile: string; HelpContext: Integer; var CancelDisplay: Wordbool); begin ShowMessage(Description); end; procedure TCha tForm.Disconnect1Click(Sender: TObject); begin ClientSocket.Close; FileListenItemClick(nil); end; procedure TChatForm.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); begin Statusbar1.Panels[0].Text := 'Connected to: ' + Socket.Remo teHost; end; procedure TChatForm.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); begin Memo2.Lines.Add(Socket.ReceiveText); end; procedure TChatForm.ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); begin Memo2.Lines.Add(Socket.ReceiveText); end; procedure TChatForm.ServerSocketAccept(Sender: TObject; Socket: TCustomWinSocket); begin IsServer := True; Statusbar1.Panels[0].Text := 'Connected to: ' + Socket.RemoteAddress; end; procedure TChatForm.Se rverSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin Memo2.Lines.Clear; end; procedure TChatForm.ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin FileListenItemClick(nil); end; procedure TChatForm.ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin Memo2.Lines.Add('Error connecting to : ' + Server); ErrorCode := 0; end; procedure TChatForm.ServerSocketClien tDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin ServerSocket.Active := False; FileListenItem.Checked := not FileListenItem.Checked; FileListenItemClick(nil); end; end. файл ftp.pas unit ftp; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls, ComCtrls, OleCtrls, Menus, ExtCtrls, isp3; const FTPServer = 0; Folder = 1; OpenFolder = 2; type TMyFtp = class(TForm) Bevel1: TBevel; Panel1 : TPanel; Panel2: TPanel; Panel3: TPanel; StatusBar: TStatusBar; FileList: TListView; DirTree: TTreeView; ConnectBtn: TSpeedButton; FTP: TFTP; RefreshBtn: TSpeedButton; MainMenu1: TMainMenu; FileMenu: TMenuItem; FileNewItem: TMenuItem; FileDeleteItem: TMenuItem; FileRenameItem: TMenuItem; N2: TMenuItem; FileExitItem: TMenuItem; View1: TMenuItem; ViewLargeItem: TMenuItem; ViewSmallItem: TMenuItem; ViewListItem: TMenuItem; ViewDetailsItem: TMenuItem; N1: TMenuItem; ViewRefreshItem: TMenuItem; FilePopup: TPopupMenu; DeleteItem: TMenuItem; RenameItem: TMenuItem; CopyItem: TMenuItem; Bevel2: TBevel; Label1: TLabel; Bevel3: TBevel; Bev el5: TBevel; Label2: TLabel; SaveDialog1: TSaveDialog; CopyButton: TSpeedButton; LargeBtn: TSpeedButton; SmallBtn: TSpeedButton; ListBtn: TSpeedButton; DetailsBtn: TSpeedButton; Tools1: TMenuItem; ToolsConnectItem: TMenu Item; ToolsDisconnectItem: TMenuItem; FileCopyItem: TMenuItem; PasteFromItem: TMenuItem; OpenDialog1: TOpenDialog; SmallImages: TImageList; procedure ConnectBtnClick(Sender: TObject); procedure FTPProtocolStateChanged(Sender: TObject; ProtocolState: Smallint); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); procedure FTPBusy(Sender: TObject; isBusy: Wordbool); procedure DirTreeChange(Sender: TObject; Node: TTreeNode); procedure RefreshBtnClick(Sender: TObject); procedure DirTreeChanging(Sender: TObject; Node: TTreeNode; var AllowChange: Boolean); procedure FTPStateChanged(Sender: TObject; S tate: Smallint); procedure Open1Click(Sender: TObject); procedure FileExitItemClick(Sender: TObject); procedure FormResize(Sender: TObject); procedure ViewLargeItemClick(Sender: TObject); procedure ViewSmallItemClick(Sender: TObject); procedure ViewListItemClick(Sender: TObject); procedure ViewDetailsItemClick(Sender: TObject); procedure ViewRefreshItemClick(Sender: TObject); procedure CopyItemClick(Sender: TObject); procedure ToolsDisconnectItemClick(Sender: TObject) ; procedure FileNewItemClick(Sender: TObject); procedure DeleteItemClick(Sender: TObject); procedure PasteFromItemClick(Sender: TObject); procedure FilePopupPopup(Sender: TObject); procedure FileMenuClick(Sender: TObject); procedure FileDeleteItemClick(Sender: TObject); procedure FTPListItem(Sender: TObject; const Item: FTPDirItem); private Root: TTreeNode; function CreateItem(const FileName, Attributes, Size, Date: Variant): TListItem; procedure Disconnect; public function NodePath(Node: TTreeNode): String; end; var Myftp: TMyFtp; UserName, Pwd: String; implementation $R *.DFM uses ShellAPI, UsrInfo; function FixCase(Path: String): String; var OrdValue: byte; begin if Length(Path) = 0 then exit; OrdValue := Ord(Path[1]); if (OrdValue >= Ord('a')) and (OrdValue <= Ord('z')) then Result := Path else begin Result := AnsiLowerCaseFileName(Path); Result[1] := UpCase(Result[1]); end; end; procedure TMyFtp.ConnectBtnClick(Sender: TObject); begin if FTP.State = prcConnected then Disconnect; ConnectForm := TConnectForm.Create(Self); try if ConnectForm.ShowModal = mrOk then with FTP, ConnectForm do begin UserNa me := UserNameEdit.Text; Pwd := PasswordEdit.Text; RemoteHost := RemoteHostEdit.Text; RemotePort := StrToInt(RemotePortEdit.Text); Connect(RemoteHost, RemotePort); Root := DirTree.Items.AddChild(nil, RemoteHost); Root.ImageIndex := FTPServer; Root.SelectedIndex := FTPServer; DirTree.Selected := Root; end; finally ConnectForm.Free; end; end; procedure TMyFtp.FTPProtocolStateChanged(Sender: TObject; ProtocolState: Smallint); begin case ProtocolState of ftpAuthentication: FTP.Authenticate(UserName, Pwd); ftpTransaction: FTP.List('/'); end; end; procedure TMyFtp.FormClose(Sender: TObject; var Action: TCloseAction); begin if FTP.Busy then begin FTP.Cancel; FTP.Quit; while FTP.Busy do Application.ProcessMessages; end; end; function TMyFtp.CreateItem(const FileName, Attributes, Size, Date: Variant): TListItem; var Ext: String; ShFileInfo: TSHFILEINFO; begin Result := FileList.Items.Add; with Result do begin Caption := FixCase(Trim(FileName)); if Size > 0 then begin if Size div 1024 <> 0 then begin SubItems.Add(IntToStr(Size div 1024)); SubItems[0] := SubItems[0] + 'KB'; end else SubItems.Add(Size); end else SubItems.Add(''); if Attributes = '1' then begin SubItems.Add('File Folder'); ImageIndex := 3; end else begin Ext := ExtractFileExt(FileName); ShGetFileInfo(PChar('c :\*' + Ext), 0, SHFileInfo, SizeOf(SHFileInfo), SHGFI_SMALLICON or SHGFI_SYSICONINDEX or SHGFI_TYPENAME); if Length(SHFileInfo.szTypeName) = 0 then begin if Length(Ext) > 0 then begin System.Delete(Ext, 1, 1); SubItems.Add(Ext + ' File'); end else SubItems.Add('File'); end else SubItems.Add(SHFileInfo.szTypeName); ImageIndex := SHFileInfo.iIcon; end; SubItems.Add(Date); end; end; procedure TMyFtp.Disconnect; begin FTP.Quit; Application.ProcessMessages; end; procedure TMyFtp.FormCreate(Sender: TObject); var SHFileInfo: TSHFileInfo; begin with DirTree do begin DirTree.Images := SmallImages; SmallImages.ResourceLoad(rtBitmap, 'IMAGES', clOlive); end; with FileList do begin SmallImages := TImageList.CreateSize(16,16); SmallImages.ShareImages := True; SmallImages.Handle := ShGetFileInfo('*.*', 0, SHFileInfo, SizeOf(SH FileInfo), SHGFI_SMALLICON or SHGFI_ICON or SHGFI_SYSICONINDEX); LargeImages := TImageList.Create(nil); LargeImages.ShareImages := True; LargeImages.Handle := ShGetFileInfo('*.*', 0, SHFileInfo, SizeOf(SHFileInfo), SHGFI_LARGEICON or SHGF I_ICON or SHGFI_SYSICONINDEX); end; end; procedure TMyFtp.FTPBusy(Sender: TObject; isBusy: Wordbool); begin if isBusy then begin Screen.Cursor := crHourGlass; FileList.Items.BeginUpdate; FileList.Items.Clear; end else begin Scr een.Cursor := crDefault; FileList.Items.EndUpdate; end; end; function TMyFtp.NodePath(Node: TTreeNode): String; begin if Node = Root then Result := '.' else Result := NodePath(Node.Parent) + '/' + Node.Text; end; procedure TMyFtp.DirTreeChange(Sender: TObject; Node: TTreeNode); var NP: String; begin if (FTP.State <> prcConnected) or FTP.Busy then exit; if Node <> nil then begin NP := NodePath(DirTree.Selected); FTP.List(NP); Label2.Caption := Fo rmat('Contents of: ''%s/''',[NP]); end; end; procedure TMyFtp.RefreshBtnClick(Sender: TObject); begin FTP.List(NodePath(DirTree.Selected)); end; procedure TMyFtp.DirTreeChanging(Sender: TObject; Node: TTreeNode; var AllowChange: Boolean); begin AllowChange := not FTP.Busy; end; procedure TMyFtp.FTPStateChanged(Sender: TObject; State: Smallint); begin with FTP, Statusbar.Panels[0] do case State of prcConnecting : Text := 'Connecting'; prcResolvingHost: Text := 'Connecting'; prcHostResolved : Text := 'Host resolved'; prcConnected : begin Text := 'Connected to: ' + RemoteHost; ConnectBtn.Hint := 'Disconnect'; FileNewItem.Enabled := True; ViewLargeItem.Enabled := Tru e; ViewSmallItem.Enabled := True; ViewListItem.Enabled := True; ViewDetailsItem.Enabled := True; ViewRefreshItem.Enabled := True; ToolsDisconnectItem.Enabled := True; LargeBtn.Enabled := True; SmallBtn.Enabled := True; ListBtn.Enabled := True; DetailsBtn.Enabled := True; RefreshBtn.Enabled := True; end; prcDisconnecting: Text := 'Disconnecting'; prcDisconnected : begin Text := 'Disconnected'; ConnectBtn.Hint := 'Connect'; DirTree.Items.Clear; FileNewItem.Enabled := False; ViewLargeItem.Enabled := False; ViewSmallItem.Enabled := False; ViewListItem.Enab led := False; ViewDetailsItem.Enabled := False; ViewRefreshItem.Enabled := False; ToolsDisconnectItem.Enabled := False; LargeBtn.Enabled := False; SmallBtn.Enabled := False; ListBtn.Enabled := Fal se; DetailsBtn.Enabled := False; RefreshBtn.Enabled := False; end; end; end; procedure TMyFtp.Open1Click(Sender: TObject); begin FTP.Quit; DirTree.Items.BeginUpdate; try DirTree.Items.Clear; finally DirTree.Items.EndUpdate; end; end; procedure TMyFtp.FileExitItemClick(Sender: TObject); begin Close; end; procedure TMyFtp.FormResize(Sender: TObject); begin Statusbar.Panels[0].Width := Width - 150; end; procedure TMyFtp.ViewLargeItemClick(Se nder: TObject); begin FileList.ViewStyle := vsIcon; end; procedure TMyFtp.ViewSmallItemClick(Sender: TObject); begin FileList.ViewStyle := vsSmallIcon; end; procedure TMyFtp.ViewListItemClick(Sender: TObject); begin FileList.ViewStyle := vsList; end; procedure TMyFtp.ViewDetailsItemClick(Sender: TObject); begin FileList.ViewStyle := vsReport; end; procedure TMyFtp.ViewRefreshItemClick(Sender: TObject); begin DirTreeChange(nil, DirTree.Selected); end; procedure TMyFtp.CopyItemClick(Sender: T Object); begin SaveDialog1.FileName := FileList.Selected.Caption; if SaveDialog1.Execute then FTP.GetFile(NodePath(DirTree.Selected) + '/' + FileList.Selected.Caption, SaveDialog1.FileName); end; procedure TMyFtp.ToolsDisconnectItemClick(Sen der: TObject); begin DisConnect; end; procedure TMyFtp.FileNewItemClick(Sender: TObject); var DirName: String; begin if InputQuery('Input Box', 'Prompt', DirName) then FTP.CreateDir(NodePath(DirTree.Selected) + '/' + DirName); end; procedure TMyFtp.DeleteItemClick(Sender: TObject); begin if ActiveControl = DirTree then FTP.DeleteDir(NodePath(DirTree.Selected)); if ActiveControl = FileList then FTP.DeleteFile(NodePath(DirTree.Selected) + '/' + FileList.Selected.Caption); e nd; procedure TMyFtp.PasteFromItemClick(Sender: TObject); begin if OpenDialog1.Execute then FTP.PutFile(OpenDialog1.FileName, NodePath(DirTree.Selected)); end; procedure TMyFtp.FilePopupPopup(Sender: TObject); begin CopyItem.Enabled := (ActiveCon trol = FileList) and (FileList.Selected <> nil); PasteFromItem.Enabled := (ActiveControl = DirTree) and (DirTree.Selected <> nil); DeleteItem.Enabled := (ActiveControl = FileList) and (FileList.Selected <> nil); RenameItem.Enabled := (ActiveControl = FileList) and (FileList.Selected <> nil); end; procedure TMyFtp.FileMenuClick(Sender: TObject); begin FileCopyItem.Enabled := (ActiveControl = FileList) and (FileList.Selected <> nil); FileDeleteItem.Enabled := (ActiveControl = FileList) and (FileList.Selected <> nil); FileRenameItem.Enabled := (ActiveControl = FileList) and (FileList.Selected <> nil); end; procedure TMyFtp.FileDeleteItemClick(Sender: TObject); begin if (DirTree.S elected <> nil) and (FileList.Selected <> nil) then FTP.DeleteFile(FileList.Selected.Caption); end; procedure TMyFtp.FTPListItem(Sender: TObject; const Item: FTPDirItem); var Node: TTreeNode; begin CreateItem(Item.FileName, Item.Attributes, Item.S ize, Item.Date); if Item.Attributes = 1 then if DirTree.Selected <> nil then begin if DirTree.Selected <> nil then Node := DirTree.Selected.GetFirstChild else Node := nil; while Node <> nil do if A nsiCompareFileName(Node.Text, Item.FileName) = 0 then exit else Node := DirTree.Selected.GetNextChild(Node); if Node = nil then begin Node := DirTree.Items.AddChild(DirTree.Selected, Item.FileName); Node.ImageIndex := Folder; Node.SelectedIndex := OpenFolder; end; end else DirTree.Items.AddChild(Root, Item.FileName); end; end. файл nntp.pas unit nntp; interface uses Windows, M essages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, OleCtrls, StdCtrls, ComCtrls, ExtCtrls, Buttons, ActiveX, isp3; const efListGroups = 0; efGetArticleHeaders = 1; efGetArticleNumbers = 2; efGetArticle = 3; type TNewsForm = class(TForm) NNTP1: TNNTP; MainMenu1: TMainMenu; File1: TMenuItem; Exit1: TMenuItem; N1: TMenuItem; FileDisconnectItem: TMenuItem; FileConnectItem: TMenuItem; Panel1: TPanel; Bevel1: TBevel; StatusBar: TStatusBar; SmallImages: TImageList; Panel2: TPanel; NewsGroups: TTreeView; Bevel2: TBevel; Panel3: TPanel; Memo1: TMemo; Panel5: TPanel; Panel4: TPanel; ConnectBtn: TSpeedButton; RefreshBtn: TSpeedButton; Bevel3 : TBevel; MsgHeaders: TListBox; Label1: TLabel; Label2: TLabel; procedure FileConnectItemClick(Sender: TObject); procedure NNTP1ProtocolStateChanged(Sender: TObject; ProtocolState: Smallint); procedure NNTP1StateChanged(Sender: TObject; State: Smallint); procedure Exit1Click(Sender: TObject); procedure MsgHeadersDblClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure NewsGroupsCha nge(Sender: TObject; Node: TTreeNode); procedure RefreshBtnClick(Sender: TObject); procedure FileDisconnectItemClick(Sender: TObject); procedure NNTP1Banner(Sender: TObject; const Banner: WideString); procedure NNTP1DocOutput(Sender: TObjec t; const DocOutput: DocOutput); procedure NNTP1Error(Sender: TObject; Number: Smallint; var Description: WideString; Scode: Integer; const Source, HelpFile: WideString; HelpContext: Integer; var CancelDisplay: WordBool); procedure NNTP1SelectGroup(Sender: TObject; const groupName: WideString; firstMessage, lastMessage, msgCount: Integer); private EventFlag: Integer; function NodePath(Node: TTreeNode): String; public Data: String; end; var NewsForm: TNewsForm; Remainder: String; Nodes: TStringList; CurrentGroup: String; GroupCount: Integer; implementation uses Connect; $R *.DFM TParser type TToken = (etEnd, etSymbol, etName, etLiteral); TParser = class private FFlags: Integer; FText: string; FSourcePtr: PChar; FSourceLine: Integer; FTokenPtr: PChar; FTokenString: string; FToken: TToken; procedure SkipBlanks; procedure NextToken; public constructor Create(const Text: string; Groups: Boolean); end; const sfAllowSpaces = 1; constructor TParser.Create(const Text: string; Groups: Boolean); begin FText := Text; FSourceLine := 1; FSourcePtr := PChar(Text); if Groups then F Flags := sfAllowSpaces else FFlags := 0; NextToken; end; procedure TParser.SkipBlanks; begin while True do begin case FSourcePtr^ of #0: begin if FSourcePtr^ = #0 then Exit; Continue; end; #10: Inc(FSourceLine); #33..#255: Exit; end; Inc(FSourcePtr); end; end; procedure TParser.NextToken; var P, TokenStart: PChar; begin SkipBlanks; FTokenString := ''; P := FSourcePtr; while (P^ <> #0) and (P^ <= ' ') do Inc(P); FTokenPtr := P; case P^ of '0'..'9': begin TokenStart := P; Inc(P); while P^ in ['0'..'9'] do Inc(P); SetString(FTokenString, TokenStart, P - TokenStart); FToken := etLiteral; end; #13: Inc(FSourceLine); #0: FToken := etEnd; else begin TokenStart := P; Inc(P); if FFlags = sfAllowSpaces then while not (P^ in [#0, #13, ' ']) do Inc(P) else while not (P^ in [#0, #13] ) do Inc(P); SetString(FTokenString, TokenStart, P - TokenStart); FToken := etSymbol; end; end; FSourcePtr := P; end; function FirstItem(var ItemList: ShortString): ShortString; var P: Integer; begin P := AnsiPos('.', ItemList); if P = 0 then begin Result := ItemList; P := Length(ItemList); end else Result := Copy(ItemList, 1, P - 1); Delete(ItemList, 1, P); end; procedure AddItem(GroupName: ShortString); var Index, i: Integer; Groups: Integer; Item: ShortString; TheNodes: TStringList; begin Groups := 1; for i := 0 to Length(GroupName) do if GroupName[i] = '.' then Inc(Groups); TheNodes := Nodes; for i := 0 to Groups - 1 do begin Item := FirstItem(GroupName); Index := TheNodes.IndexOf(Item); if Index = -1 then begin Index := TheNodes.AddObject(Item, TStringList.Create); TheNodes := TStringList(TheNodes.Objects[Index]); TheNodes.Sorted := True; end else TheNodes := TStringList(TheNodes.Objects[Index]); end; Inc(GroupCount); end; procedure ParseGroups(Data: String); var Parser: TParser; OldSrcLine: Integer; begin Parser := TParser.Create(Data, True); OldSrcLine := 0; while Parser.FToke n <> etEnd do begin if Parser.FSourceLine <> OldSrcLine then begin AddItem(Parser.FTokenString); OldSrcLine := Parser.FSourceLine; end; Parser.NextToken; end; end; procedure ParseHeaders(Data: String); var Parser: TParser; MsgNo: LongInt; Header: String; OldSrcLine: Integer; begin Parser := TParser.Create(Data, False); while Parser.FToken <> etEnd do begin MsgNo := StrToInt(Parser.FTokenString); OldSrcLine := Parser.FSourceLine; Par ser.NextToken; Header := ''; while (OldSrcLine = Parser.FSourceLine) do begin Header := Header + ' ' + Parser.FTokenString; Parser.NextToken; if Parser.FToken = etEnd then Break; end; NewsForm.MsgHeaders.Items. AddObject(Header, Pointer(MsgNo)); end; end; procedure DestroyList(AList: TStringList); var i: Integer; begin for i := 0 to AList.Count - 1 do if AList.Objects[i] <> nil then DestroyList(TStringList(AList.Objects[i])); AList.Free; end; procedure BuildTree(Parent: TTreeNode; List: TStrings); var i: Integer; Node: TTreeNode; begin for i := 0 to List.Count - 1 do if List.Objects[i] <> nil then begin Node := NewsForm.NewsGroups.Items.AddChild(Parent, List[i]); Node. ImageIndex := 0; Node.SelectedIndex := 1; BuildTree(Node, TStrings(List.Objects[i])); end else NewsForm.NewsGroups.Items.AddChild(Parent, List[i]); end; function TNewsForm.NodePath(Node: TTreeNode): String; begin if Node.Parent = nil then Result := Node.Text else Result := NodePath(Node.Parent) + '.' + Node.Text; end; procedure TNewsForm.FileConnectItemClick(Sender: TObject); begin ConnectDlg := TConnectDlg.Create(Self); try if ConnectDlg.ShowModal = mrOk then with NNTP1 do Connect(ConnectDlg.ServerEdit.Text, RemotePort); finally ConnectDlg.Free; end; end; procedure TNewsForm.NNTP1ProtocolStateChanged(Sender: TObject; ProtocolState: Smallint); begin case ProtocolState of nntpBase: ; nntpTransaction: begin EventFlag := efListGroups; Nodes := TStringList.Create; Nodes.Sorted := True; NNTP1.ListGroups; end; end; end; procedure TNewsForm.NNTP1StateChanged(Sender: TObject; State: Smallint); begin with Memo1.Lines do case NNTP1.State of prcConnecting : Add('Connecting'); prcResolvingHost: Add('Resolving Host: ' + NNTP1.RemoteHost); prcHostResolve d : Add('Host resolved'); prcConnected : begin Add('Connected to: ' + NNTP1.RemoteHost); Statusbar.Panels[0].Text := 'Connected to: ' + NNTP1.RemoteHost; ConnectBtn.Enabled := False; FileConnectItem. Enabled := False; RefreshBtn.Enabled := True; end; prcDisconnecting: Text := NNTP1.ReplyString; prcDisconnected : begin Statusbar.Panels[0].Text := 'Disconnected'; Caption := 'News Reader'; Label1.Caption := ''; ConnectBtn.Enabled := True; FileConnectItem.Enabled := True; RefreshBtn.Enabled := False; end; end; end; procedure TNewsForm.Exit1Click(Sender: TObject); begin if NNTP1.State <> prcDisconnected then begin if NNTP1.Busy then NNTP1.Cancel; NNTP1.Quit; while NNTP1.State <> prcDisconnected do Application.ProcessMessages; end; Close; end; procedure TNewsForm.MsgHeadersDblClick(Sender: TObjec t); var Article: Integer; begin if NNTP1.Busy then exit; EventFlag := efGetArticle; Memo1.Clear; if MsgHeaders.ItemIndex = -1 then exit; Caption := 'News Reader: ' + MsgHeaders.Items[MsgHeaders.ItemIndex]; Article := Integer(MsgHeaders.Items. Objects[MsgHeaders.ItemIndex]); NNTP1.GetArticlebyArticleNumber(Article); end; procedure TNewsForm.FormClose(Sender: TObject; var Action: TCloseAction); begin if NNTP1.State <> prcDisconnected then begin if NNTP1.Busy then NNTP1.Cancel; NNTP1.Quit; while NNTP1.State <> prcDisconnected do Application.ProcessMessages; end; end; procedure TNewsForm.NewsGroupsChange(Sender: TObject; Node: TTreeNode); var NP: String; begin if (NNTP1.State = prcConnected) and not NNTP1.Busy then with MsgHeaders do begin Items.BeginUpdate; try Items.Clear; Memo1.Lines.Clear; NP := NodePath(NewsGroups.Selected); Statusbar.Panels[2].Text := 'Bytes: 0'; Statusbar.Panels[1].Text := '0 Ar ticle(s)'; if NNTP1.Busy then NNTP1.Cancel; NNTP1.SelectGroup(NP); Label1.Caption := 'Contents of ''' + NP + ''''; finally Items.EndUpdate; end; end; end; procedure TNewsForm.RefreshBtnClick(Sender: TObject); begin if NewsGroups.Selected <> nil then NewsGroupsChange(nil, NewsGroups.Selected); end; procedure TNewsForm.FileDisconnectItemClick(Sender: TObject); begin if NNTP1.Busy then NNTP1.Cancel; NNTP1.Quit; while NNTP1.Busy do Application.ProcessMessages; with NewsGroups.Items do begin BeginUpdate; Clear; EndUpdate; end; MsgHeaders.Items.Clear; Memo1.Lines.Clear; end; procedure TNewsForm.NNTP1Banner(Sender: TObject; co nst Banner: WideString); begin Memo1.Lines.Add(Banner); end; procedure TNewsForm.NNTP1DocOutput(Sender: TObject; const DocOutput: DocOutput); begin Statusbar.Panels[2].Text := Format('Bytes: %d',[DocOutput.BytesTransferred]); case DocOutput.State of icDocBegin: begin if EventFlag = efListGroups then Memo1.Lines.Add('Retrieving news groups...'); Data := ''; GroupCount := 0; end; icDocData: begin Data := Data + DocOutput.DataString; if EventFlag = efGetArticle then Memo1.Lines.Add(Data); end; icDocEnd: begin case EventFlag of efListGroups: begin ParseGroups(Data); Memo1.Lines.Add('Done.'#13#10'Building news group tree...'); NewsGroups.Items.BeginUpdate; try BuildTree(nil, Nodes); DestroyList(Nodes); Statusbar.Panels[1].Text := Format('%d Groups',[GroupCount]); finally NewsGroups.Items.EndUpdate; Memo1.Lines.Add('Done.'); end; end; efGetArticleHeaders: ParseHeaders(Data); efGetArticle: begin Memo1.SelStart := 0; SendMessage(Memo1.Handle, EM_ScrollCaret, 0, 0); end; end; SetLength(Data, 0); end; end; Refresh; end; procedure TNewsForm.NNTP1Error(Sender: TObject; Nu mber: Smallint; var Description: WideString; Scode: Integer; const Source, HelpFile: WideString; HelpContext: Integer; var CancelDisplay: WordBool); begin // MessageDlg(Description, mtError, [mbOk], 0); end; procedure TNewsForm.NNTP1SelectGroup(Sender: TObject; const groupName: WideString; firstMessage, lastMessage, msgCount: Integer); begin EventFlag := efGetArticleHeaders; Statusbar.Panels[1].Text := Format('%d Article(s)',[msgCount]); NNTP1.GetArt icleHeaders('subject', FirstMessage, lastMessage); end; end. файл smtp.pas unit Smtp; interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls, Menus, StdCtrls, Dialogs, Buttons, Messages, ExtCtrls, ComCtrls, OleCtrls, ISP3; type T Mail = class(TForm) OpenDialog: TOpenDialog; SMTP1: TSMTP; POP1: TPOP; PageControl1: TPageControl; SendPage: TTabSheet; RecvPage: TTabSheet; ConPage: TTabSheet; Panel1: TPanel; Label1: TLabel; Label3: TLabel; Label2: TLabel; eTo: TEdit; eCC: TEdit; eSubject: TEdit; SendBtn: TButton; ClearBtn: TButton; reMessageText: TRichEdit; SMTPStatus: TStatusBar; Panel3: TPanel; mReadMessage: TMemo; POPStatus: TStatusBar; cbSe ndFile: TCheckBox; GroupBox1: TGroupBox; ePOPServer: TEdit; Label6: TLabel; Label5: TLabel; eUserName: TEdit; ePassword: TEdit; Label4: TLabel; GroupBox2: TGroupBox; Label7: TLabel; eSMTPServer: TEdit; SMTPConnectBtn: TButton; POPConnectBtn: TButton; eHomeAddr: TEdit; Label8: TLabel; Panel2: TPanel; Label9: TLabel; lMessageCount: TLabel; Label10: TLabel; eCurMessage: TEdit; udCurMessage: TUpDown; ConnectStatus: TStatusBar; procedure FormCreate(Sender: TObject); procedure POP1StateChanged(Sender: TObject; State: Smallint); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure SMTP1StateChanged(Sender: TObject; State: Smallint); procedure FormResize(Sender: TObject); procedure ClearBtnClick(Sender: TObject); procedure SMTP1Verify(Sender: TObject); procedure SendBtnClick(Sender: TObject); procedure POP1ProtocolStateChanged(Sender: TObject; ProtocolState: Smallint); procedure SMTPConnectBtnClick(Sender: TObject); procedure POPConnectBtnClick(Sender: TObject); procedure eSMTPServerChange(Sender: TObject); procedure ePOPServerChange(Sender: TObject); procedure cbSendFileClick(Sender: TObject); procedure udCurMessageClick(Sender: TObject; Button: TUDBtnType); procedure POP1RefreshMessageCount(Sender: TObject; Number: Integer); procedure POP1DocOutput(Sender: TObject; const DocOutput: Doc Output); procedure POP1Error(Sender: TObject; Number: Smallint; var Description: WideString; Scode: Integer; const Source, HelpFile: WideString; HelpContext: Integer; var CancelDisplay: WordBool); procedure SMTP1DocInput(Sender: T Object; const DocInput: DocInput); procedure SMTP1Error(Sender: TObject; Number: Smallint; var Description: WideString; Scode: Integer; const Source, HelpFile: WideString; HelpContext: Integer; var CancelDisplay: WordBool); private RecvVerified, SMTPError, POPError: Boolean; FMessageCount: Integer; procedure SendFile(Filename: string); procedure SendMessage; procedure CreateHeaders; end; var Mail: TMail; implementation $R *.DFM const icDocBegin = 1; icDocHeaders = 2; icDocData = 3; icDocEnd = 5; When calling a component method which maps onto an OLE call, NoParam substitutes for an optional parameter. As an alternative to calling the component method, you may access the compo nent's OLEObject directly - i.e., Component.OLEObject.MethodName(,Foo,,Bar) function NoParam: Variant; begin TVarData(Result).VType := varError; TVarData(Result).VError := DISP_E_PARAMNOTFOUND; end; procedure TMail.FormCreate(Sender: TObject); begin SMTPError := False; POPError := False; FMessageCount := 0; end; procedure TMail.FormClose(Sender: TObject; var Action: TCloseAction); begin if POP1.State = prcConnected then POP1.Quit; if SMTP1.State = prcConnected then SMTP1.Quit; end; procedure TMail.FormResize(Sender: TObject); begin SendBtn.Left := ClientWidth - SendBtn.Width - 10; ClearBtn.Left := ClientWidth - ClearBtn.Width - 10; cbSendFile.Left := ClientWidth - cbSendFile.Width - 10; eTo.Width := SendBtn.Left - eTo.Left - 10; eCC.Width := SendBtn.Left - eCC.Left - 10; eSubject.Width := SendBtn.Left - eSubject.Left - 10; end; procedure TMail.ClearBtnClick(Sender: TObject); begin eTo.Text := ''; eCC.Text := ''; eSubject.Text := ''; OpenDialog.Filename := ''; re MessageText.Lines.Clear; end; procedure TMail.eSMTPServerChange(Sender: TObject); begin SMTPConnectBtn.Enabled := (eSMTPServer.Text <> '') and (eHomeAddr.Text <> ''); end; procedure TMail.ePOPServerChange(Sender: TObject); begin POPConnectBtn.Enabled := (ePOPServer.Text <> '') and (eUsername.Text <> '') and (ePassword.Text <> ''); end; procedure TMail.cbSendFileClick(Sender: TObject); begin if cbSendFile.Checked then begin if OpenDialog.Execute then cbSendFile .Caption := cbSendFile.Caption + ': '+OpenDialog.Filename else cbSendFile.Checked := False; end else cbSendFile.Caption := '&Attach Text File'; end; Clear and repopulate MIME headers, using the component's DocInput property. A separate Do cInput OLE object could also be used. See RFC1521/1522 for complete information on MIME types. procedure TMail.CreateHeaders; begin with SMTP1 do begin DocInput.Headers.Clear; DocInput.Headers.Add('To', eTo.Text); DocInput.Headers.Add('Fro m', eHomeAddr.Text); DocInput.Headers.Add('CC', eCC.Text); DocInput.Headers.Add('Subject', eSubject.Text); DocInput.Headers.Add('Message-Id', Format('%s_%s_%s', [Application.Title, DateTimeToStr(Now), eHomeAddr.Text])); DocInput.Headers.Add('Content-Type', 'TEXT/PLAIN charset=US-ASCII'); end; end; Send a simple mail message procedure TMail.SendMessage; begin CreateHeaders; with SMTP1 do SendDoc(NoParam, DocInput.Headers, reMessageText.Text, '', ''); end; Send a disk file. Leave SendDoc's InputData parameter blank and specify a filename for InputFile to send the contents of a disk file. You can use the DocInput event and GetData methods to do custom encoding (Base64, UUEncode, etc.) procedure TMail.Send File(Filename: string); begin CreateHeaders; with SMTP1 do begin DocInput.Filename := FileName; SendDoc(NoParam, DocInput.Headers, NoParam, DocInput.FileName, ''); end; end; Set global flag indicating recipients are addressable (this only ensures that the address is in the correct format, not that it exists and is deliverable), then send the text part of the message procedure TMail.SMTP1Verify(Sender: TObject); begin SendMe ssage; RecvVerified := True; end; Verify addressees, send text message in the Verify event, and if an attachment is specified, send it procedure TMail.SendBtnClick(Sender: TObject); var Addressees: string; begin if SMTP1.State = prcConnected then begin RecvVerified := False; SMTPError := False; Addressees := eTo.Text; if eCC.Text <> '' then Addressees := Addressees + ', '+ eCC.Text; SMTP1.Verify(Addressees); wait for completion of Verify-Text message send whi le SMTP1.Busy do Application.ProcessMessages; Check global flag indicating addresses are in the correct format - if true, the text part of the message has been sent if not RecvVerified then begin MessageDlg('Incorrect address format', mtError, [mbOK], 0); Exit; end else if cbSendFile.Checked then SendFile(OpenDialog.Filename); end else MessageDlg('Not connected to SMTP server', mtError, [mbOK], 0); end; S MTP component will call this event every time its connection state changes procedure TMail.SMTP1StateChanged(Sender: TObject; State: Smallint); begin case State of prcConnecting: ConnectStatus.SimpleText := 'Connecting to SMTP server: '+SMTP1. RemoteHost+'...'; prcResolvingHost: ConnectStatus.SimpleText := 'Resolving Host'; prcHostResolved: ConnectStatus.SimpleText := 'Host Resolved'; prcConnected: begin ConnectStatus.SimpleText := 'Connected to SMTP server: '+SMTP1.RemoteHost; SMTPConnectBtn.Caption := 'Disconnect'; end; prcDisconnecting: ConnectStatus.SimpleText := 'Disconnecting from SMTP server: '+SMTP1.RemoteHost+'...'; prcDisconnected: begin ConnectStatus.SimpleText := 'Disconnected from SMTP server: '+SMTP1.RemoteHost; SMTPConnectBtn.Caption := 'Connect'; end; end; eSMTPServer.Enabled := not (State = prcConnected); eHomeAddr.Ena bled := not (State = prcConnected); end; The DocInput event is called each time the DocInput state changes during a mail transfer. DocInput holds all the information about the current transfer, including the headers, the number of bytes transferred, and the message data itself. Although not shown in this example, you may call DocInput's SetData method if DocInput.State = icDocData to encode the data before each block is sent. procedure TMail.SMTP1DocInput(Sender: TObject; const DocInput: DocInput); beg in case DocInput.State of icDocBegin: SMTPStatus.SimpleText := 'Initiating document transfer'; icDocHeaders: SMTPStatus.SimpleText := 'Sending headers'; icDocData: if DocInput.BytesTotal > 0 then SMTPStatus .SimpleText := Format('Sending data: %d of %d bytes (%d%%)', [Trunc(DocInput.BytesTransferred), Trunc(DocInput.BytesTotal), Trunc(DocInput.BytesTransferred/DocInput.BytesTotal*100)]) else SMTPStatus.SimpleText := 'Sending ...'; icDocEnd: if SMTPError then SMTPStatus.SimpleText := 'Transfer aborted' else SMTPStatus.SimpleText := Format('Mail sent to %s (%d bytes data)', [eTo.Text, Trunc(DocInput.BytesTransferred)]); end; SMTPStat us.Update; end; The Error event is called whenever an error occurs in the background processing. In addition to providing an error code and brief description, you can also access the SMTP component's Errors property (of type icErrors, an OLE object) to g et more detailed information procedure TMail.SMTP1Error(Sender: TObject; Number: Smallint; var Description: WideString; Scode: Integer; const Source, HelpFile: WideString; HelpContext: Integer; var CancelDisplay: WordBool); var I: Integer; ErrorSt r: string; begin SMTPError := True; CancelDisplay := True; Get extended error information for I := 1 to SMTP1.Errors.Count do ErrorStr := Format(#13'(%s)', [SMTP1.Errors.Item(I).Description]); Display error code, short and long error description MessageDlg(Format('%d - %s%s', [Number, Description, Trim(ErrorStr)]), mtError, [mbOK], 0); end; Unlike POP, SMTP does not require a user account on the host machine, so no user authorization is nec essary procedure TMail.SMTPConnectBtnClick(Sender: TObject); begin if SMTP1.State = prcConnected then SMTP1.Quit else if SMTP1.State = prcDisconnected then begin SMTP1.RemoteHost := eSMTPServer.Text; SMTPError := False; SMT P1.Connect(NoParam, NoParam); end; end; Unlike SMTP, users must be authorized on the POP server. The component defines a special protocol state, popAuthorization, when it requests authorization. If authorization is successful, the protocol state chang es to popTransaction and POP commands can be issued. Note that server connection is independent of the authorization state. procedure TMail.POP1ProtocolStateChanged(Sender: TObject; ProtocolState: Smallint); begin case ProtocolState of popAuthorization: POP1.Authenticate(POP1.UserID, POP1.Password); popTransaction: ConnectStatus.SimpleText := Format('User %s authorized on server %s', [eUsername.Text, ePOPServer.Text]); end; end; This event is called every time the connection status of the POP server changes procedure TMail.POP1StateChanged(Sender: TObject; State: Smallint); begin case State of prcConnecting: ConnectStatus.SimpleText := 'Connecting to POP server: '+POP1.RemoteHost+'...'; prc ResolvingHost: ConnectStatus.SimpleText := 'Resolving Host'; prcHostResolved: ConnectStatus.SimpleText := 'Host Resolved'; prcConnected: begin ConnectStatus.SimpleText := 'Connected to POP server: '+POP1.RemoteHost; POPConnectBtn.Caption := 'Disconnect'; end; prcDisconnecting: ConnectStatus.SimpleText := 'Disconnecting from POP server: '+POP1.RemoteHost+'...'; prcDisconnected: begin ConnectStatus.SimpleText := 'Disconnected from POP server: '+POP1.RemoteHost; POPConnectBtn.Caption := 'Connect'; end; end; ePOPServer.Enabled := not (State = prcConnected); eUsername.Enabled := not (State = prcConnected); ePassword.Enabled := not (State = prcConnected); end; The Error event is called whenever an error occurs in the background processing. In addition to providing an error code and brief description, you can also access the POP component's Errors property (of type icErrors, an OLE object) to get more detailed information procedure TMail.POP1Error(Sender: TObject; Number: Smallint; var Description: WideString; Scode: Integer; const Source, HelpFile: WideString; HelpContext: Integer; var CancelDisplay: W ordBool); var I: Integer; ErrorStr: string; begin POPError := True; CancelDisplay := True; if POP1.ProtocolState = popAuthorization then ConnectStatus.SimpleText := 'Authorization error'; Get extended error information for I := 1 to POP1.Errors.Count do ErrorStr := Format(#13'(%s)', [POP1.Errors.Item(I).Description]); Display error code, short and long error description MessageDlg(Format('%d - %s%s', [Number, Description, Trim(ErrorStr)]), mtError, [mbOK], 0) ; end; POP requires a valid user account on the host machine procedure TMail.POPConnectBtnClick(Sender: TObject); begin if (POP1.State = prcConnected) and (POP1.ProtocolState = popTransaction) and not POP1.Busy then begin mReadMessage.Lines.Cl ear; POP1.Quit; end else if POP1.State = prcDisconnected then begin POP1.RemoteHost := ePOPServer.Text; POP1.UserID := eUserName.Text; POP1.Password := ePassword.Text; POP1.Connect(NoParam, NoParam); end; end; The DocOutput event is the just like the DocInput event in 'reverse'. It is called each time the component's DocOutput state changes during retrieval of mail from the server. When the state = icDocData, you can call DocOutput.GetData to decode each data block based on the MIME content type specified in the headers. procedure TMail.POP1DocOutput(Sender: TObject; const DocOutput: DocOutput); var Buffer: WideString; I: Integer; begin case DocOutput.State of icDocBegin: POPStatus.SimpleText := 'Initiating document transfer'; icDocHeaders: begin POPStatus.SimpleText := 'Retrieving headers'; for I := 1 to DocOutput.Headers.Count do mReadMess age.Lines.Add(DocOutput.Headers.Item(I).Name+': '+ DocOutput.Headers.Item(I).Value); end; icDocData: begin POPStatus.SimpleText := Format('Retrieving data - %d bytes', [Trunc(DocOutput.BytesTransferred)]); Buffer := DocOutput.DataString; mReadMessage.Text := mReadMessage.Text + Buffer; end; icDocEnd: if POPError then POPStatus.SimpleText := 'Transfer aborted' else POP Status.SimpleText := Format('Retrieval complete (%d bytes data)', [Trunc(DocOutput.BytesTransferred)]); end; POPStatus.Update; end; Retrieve message from the server procedure TMail.udCurMessageClick(Sender: TObject; Button: TUDBtnType); be gin if (POP1.State = prcConnected) and (POP1.ProtocolState = popTransaction) then begin POPError := False; mReadMessage.Lines.Clear; POP1.RetrieveMessage(udCurMessage.Position); end; end; The RefreshMessageCount event is called whenever the RefreshMessageCount method is called, and also when a connection to the POP server is first made procedure TMail.POP1RefreshMessageCount(Sender: TObject; Number: Integer); begin FMessageCount := Number; udCurMessage.Max := Number; udCurMessag e.Enabled := Number <> 0; lMessageCount.Caption := IntToStr(Number); if Number > 0 then begin udCurMessage.Min := 1; udCurMessage.Position := 1; POP1.RetrieveMessage(udCurMessage.Position); end; end; end. файл webbrows.dpr program Webbrows; uses Forms, main in 'Main.pas' MainForm , SMTP in 'Smtp.pas', Mail FTP in 'ftp.pas', MyFtp NNTP in 'nntp.pas', NewsForm CHAT in 'chat.pas'; ChatForm $R *.RES begin Application.Initialize; Application.CreateFor m(TMainForm, MainForm); Application.CreateForm(TDocSourceFrm, DocSourceFrm); Application.run; end. Приложение 1. Исходный текст модели корпоративной сети uses crt,dos,graph; CONST VertexQuantity=7; DelayInDomain=1000; DelaySendToRouter=1000; DelayRouterReceive=1000; AdjacencyMatrix : array[1..VertexQuantity,1..VertexQuantity] of byte =( (0,1,0,1,0,0,0), (1,0,1,0,1,0,1), (0,1,0,1,0,0,0), (1,0,1,0,1,0,0), (0,1,0,1,0,1, 0), (0,0,0,0,1,0,1), (0,1,0,0,0,1,0) ); TYPE TAddr = record address format router:byte; domain:byte; comp :byte; END; TYPE TBatch = record batch format from:TAddr; to_ :TAddr; data:string; path:array[1..20] of byte; path is chain of router numbers END; TYPE TComp = object terminal addr:TAddr; adress mem :TBatch; memory Procedure Send2Router(batch:TBatch); send batch Procedure Send(batch:TBatch); send batch into domain Procedure Receive(batch:TBat ch;byRouter:boolean); receive batch END; TYPE TRouter = object num :byte; x,y :integer; memory :Tbatch; state :boolean; active or inactive Procedure Receive(routerNum:byte;batch:TBatch); Procedure Send2Comp(batch:TBatch ); Procedure CalcMinPath(sender,target:byte); Procedure Send2NextRouter(batch:TBatch;currentRouter:byte); END; VAR computers : array[1..38] of TComp; all computers in the global net routers : array[1..7] of TRouter; all routers in the global net OptimalPath : array[1..49] of byte; 1--> [1,2,3,4,5] OptPathPtr : byte; type TMark = record delta : integer; prevPtr : byte; end; type vertex = record mark : TMark; marked : boolean; end; AdjacencyRec = record link :byte; weig ht:integer; end; VAR AMatr : array[1..7,1..7] of AdjacencyRec; vertexArr : array [1..7] of vertex; PROCEDURE HiddenCursor;assembler; asm mov ah,01 mov ch,20 mov cl,18 int 10h end; PROCEDURE NormalCursor;assembler; asm mov ah,01 mov ch,9 mov cl,10 int 10h end; Procedure Push(num:byte); Begin OptimalPath[OptPathPtr+1]:=num;inc(OptPathPtr); End; Procedure Pop; Begin OptimalPath[OptPathPtr]:=0;dec(OptPathPtr); End; Procedure ShowGraphics(s econd:boolean); Var grDr,grMode:integer; i :integer; Begin grDr:=vga;grMode:=2; InitGraph(grDr,grMode,'d:\lang\tp\bgi'); SetTextStyle(DefaultFont,HorizDir,2);SetColor(lightRed); OutTextXY(10,20,'Arrangement scheme of routers'); SetColor(white);Rectangle(5,15,480,40); Rectangle(5,48,480,70);SetTextStyle(DefaultFont,HorizDir,1);setcolor(lightgreen); OutTextXY(10,55,'Main address : Router.Domain.Computer (for ex., 4.2.4)'); setcolor(white);setFillStyle(7,lightblue);floodfill (5,5,white); setlinestyle(0,0,3); rectangle(0,0,getmaxX-20,getmaxY-20); setFillStyle(9,lightgray); floodfill(getmaxX,getmaxY,white); setlinestyle(0,0,NormWidth); SetFillStyle(1,red); -------------------router circles----------------------- Circle(routers[1].x,routers[1].y,10);FloodFill(routers[1].x,routers[1].y,white); Circle(routers[2].x,routers[2].y,10);FloodFill(routers[2].x,routers[2].y,white); Circle(routers[3].x,routers[3].y,10);FloodFill(routers[3].x,routers[3].y,white); Ci rcle(routers[4].x,routers[4].y,10);FloodFill(routers[4].x,routers[4].y,white); Circle(routers[5].x,routers[5].y,10);FloodFill(routers[5].x,routers[5].y,white); Circle(routers[6].x,routers[6].y,10);FloodFill(routers[6].x,routers[6].y,white); Circle(ro uters[7].x,routers[7].y,10);FloodFill(routers[7].x,routers[7].y,white); SetFillStyle(1,yellow); SetColor(red); -------------------router lines------------------------- Line(routers[1].x,routers[1].y-10,routers[2].x-2,routers[2].y+10); Line(router s[1].x,routers[1].y+10,routers[4].x-10,routers[4].y-6); Line(routers[3].x,routers[3].y-10,routers[2].x+2,routers[2].y+10); Line(routers[3].x,routers[3].y+10,routers[4].x,routers[4].y-10); Line(routers[2].x+4,routers[2].y+10,routers[5].x-2,routers[5]. y-10); Line(routers[2].x+10,routers[2].y,routers[7].x-10,routers[7].y); Line(routers[5].x+2,routers[5].y-10,routers[6].x,routers[6].y+10); Line(routers[6].x,routers[6].y-10,routers[7].x,routers[7].y+10); Line(routers[4].x+10,routers[4].y,routers[5].x-10,routers[5].y); domains -------------domain 1.1---------------------------------- SetTextStyle(DefaultFont,HorizDir,1);SetColor(white); Rectangle(routers[1].x-50,routers[1].y-50,routers[1].x- 30,routers[1].y-20 ); FloodFill(routers[1].x-48,routers[1].y-48,white); Circle(20,routers[1].y-30,8);FloodFill(20,routers[1].y-30,white); Circle(40,routers[1].y-30,8);FloodFill(40,routers[1].y-30,white); Circle(60,routers[1].y-30,8);FloodFill(60,ro uters[1].y-30,white); SetColor(white); Line(routers[1].x-5,routers[1].y-10,routers[1].x-20,routers[1].y-30); Line(routers[1].x-20,routers[1].y-30,routers[1].x-110,routers[1].y-30); -------------domain 1.2---------------------------------- Rec tangle(routers[1].x-30,routers[1].y+80,routers[1].x-5,routers[1].y+92); FloodFill(routers[1].x-28,routers[1].y+82,white); Line(routers[1].x-2,routers[1].y+10,routers[1].x-20,routers[1].y+80); Circle(routers[1].x-48,routers[1].y+62,9); FloodFill(rou ters[1].x-48,routers[1].y+62,white); Line(routers[1].x-28,routers[1].y+82,routers[1].x-52,routers[1].y+62); Circle(routers[1].x+10,routers[1].y+62,8); FloodFill(routers[1].x+10,routers[1].y+62,white); Line(routers[1].x-5,routers[1].y+82,routers[1]. x+10,routers[1].y+62); Circle(routers[1].x-48,routers[1].y+92,8); FloodFill(routers[1].x-48,routers[1].y+92,white); Line(routers[1].x-28,routers[1].y+90,routers[1].x-48,routers[1].y+92); Circle(routers[1].x-43,routers[1].y+115,8); FloodFill(routers[1].x-43,routers[1].y+115,white); Line(routers[1].x-23,routers[1].y+90,routers[1].x-48,routers[1].y+115); Circle(routers[1].x-18,routers[1].y+115,8); FloodFill(routers[1].x-18,routers[1].y+115,white); Line(routers[1].x-18,routers [1].y+90,routers[1].x-18,routers[1].y+115); Circle(routers[1].x+13,routers[1].y+113,8); FloodFill(routers[1].x+13,routers[1].y+113,white); Line(routers[1].x-5,routers[1].y+92,routers[1].x+13,routers[1].y+113); -------------domain 2.1---------------------------------- Rectangle(routers[2].x-25,routers[2].y+70,routers[2].x+16,routers[2].y+79); FloodFill(routers[2].x-24,routers[2].y+72,white); Line(routers[2].x,routers[2].y+10,routers[2].x-5,routers[2].y+70); Circle(routers[2].x-24,routers[ 2].y+100,8); FloodFill(routers[2].x-24,routers[2].y+100,white); Line(routers[2].x,routers[2].y+72,routers[2].x-24,routers[2].y+100); -------------domain 2.2---------------------------------- Rectangle(routers[2].x-80,routers[2].y+10,routers[2]. x-60,routers[2].y+37); FloodFill(routers[2].x-78,routers[2].y+12,white); Line(routers[2].x-10,routers[2].y,routers[2].x-70,routers[2].y+20); Circle(routers[2].x-110,routers[2].y+20,8); FloodFill(routers[2].x-110,routers[2].y+20,white); Circle(rou ters[2].x-140,routers[2].y+20,8); FloodFill(routers[2].x-140,routers[2].y+20,white); Line(routers[2].x-70,routers[2].y+20,routers[2].x-150,routers[2].y+20); -------------domain 3.1---------------------------------- Rectangle(routers[3].x-45,rou ters[3].y-47,routers[3].x-25,routers[3].y-20); FloodFill(routers[3].x-43,routers[3].y-45,white); Circle(routers[3].x-60,routers[3].y-37,8); FloodFill(routers[3].x-60,routers[3].y-37,white); Circle(routers[3].x-80,routers[3].y-37,8); FloodFill(routers[3].x-80,routers[3].y-37,white); Line(routers[3].x-7,routers[3].y-8,routers[3].x-35,routers[3].y-37); Line(routers[3].x-35,routers[3].y-37,routers[3].x-90,routers[3].y-37); -------------domain 4.1---------------------------------- Rectangle(routers[4].x-39,routers[4].y-82,routers[4].x-13,routers[4].y-70); FloodFill(routers[4].x-37,routers[4].y-81,white); Line(routers[4].x-4,routers[4].y-10,routers[4].x-25,routers[4].y-70); Circle(routers[4].x-40,routers[4].y-105,8); Fl oodFill(routers[4].x-40,routers[4].y-105,white); Line(routers[4].x-25,routers[4].y-75,routers[4].x-40,routers[4].y-105); Circle(routers[4].x-60,routers[4].y-70,8); FloodFill(routers[4].x-60,routers[4].y-70,white); Line(routers[4].x-25,routers[4].y- 75,routers[4].x-60,routers[4].y-70); Circle(routers[4].x-40,routers[4].y-50,8); FloodFill(routers[4].x-40,routers[4].y-50,white); Line(routers[4].x-25,routers[4].y-75,routers[4].x-40,routers[4].y-50); -------------domain 4.2---------------------------------- Rectangle(routers[4].x+25,routers[4].y-35,routers[4].x+45,routers[4].y-5); FloodFill(routers[4].x+27,routers[4].y-33,white); Circle(routers[4].x+57,routers[4].y-25,8); FloodFill(routers[4].x+57,routers[4].y-25,white); Circle(router s[4].x+77,routers[4].y-25,8); FloodFill(routers[4].x+77,routers[4].y-25,white); Circle(routers[4].x+97,routers[4].y-25,8); FloodFill(routers[4].x+97,routers[4].y-25,white); Circle(routers[4].x+117,routers[4].y-25,8); FloodFill(routers[4].x+117,routers[4].y-25,white); Line(routers[4].x+9,routers[4].y-7,routers[4].x+20,routers[4].y-25); Line(routers[4].x+20,routers[4].y-25,routers[4].x+127,routers[4].y-25); -------------domain 5.1---------------------------------- Rectangle(routers[5].x-30,routers[5].y-130,routers[5].x-10,routers[5].y-100); FloodFill(routers[5].x-25,routers[5].y-128,white); Line(routers[5].x,routers[5].y-10,routers[5].x-20,routers[5].y-120); Circle(routers[5].x-48,routers[5].y-90,8); FloodFill(routers[5].x-48,routers[5].y-120+30,white); Line(routers[5].x-20,routers[5].y-120,routers[5].x-48,routers[5].y-90); Circle(routers[5].x-50,routers[5].y-120,8); FloodFill(routers[5].x-50,routers[5].y-120,white); Line(routers[5].x-20,route rs[5].y-120,routers[5].x-50,routers[5].y-120); Circle(routers[5].x-25,routers[5].y-150,8); FloodFill(routers[5].x-25,routers[5].y-150,white); Line(routers[5].x-20,routers[5].y-120,routers[5].x-25,routers[5].y-150); Circle(routers[5].x+2,routers[5]. y-150,8); FloodFill(routers[5].x+2,routers[5].y-150,white); Line(routers[5].x-20,routers[5].y-120,routers[5].x+2,routers[5].y-150); -------------domain 6.1---------------------------------- Rectangle(routers[6].x-30,routers[6].y-10,routers[6].x -14,routers[6].y+14); FloodFill(routers[6].x-28,routers[6].y-8,white); Circle(routers[6].x-42,routers[6].y,8); FloodFill(routers[6].x-42,routers[6].y,white); Circle(routers[6].x-62,routers[6].y,8); FloodFill(routers[6].x-62,routers[6].y,white); Circle(routers[6].x-82,routers[6].y,8); FloodFill(routers[6].x-82,routers[6].y,white); Line(routers[6].x-10,routers[6].y,routers[6].x-92,routers[6].y); -------------domain 7.1---------------------------------- Rectangle(routers[7].x-10,rou ters[7].y-50,routers[7].x+10,routers[7].y-25); FloodFill(routers[7].x-8,routers[7].y-48,white); Line(routers[7].x,routers[7].y-10,routers[7].x,routers[7].y-50); Circle(routers[7].x-35,routers[7].y-20,8); FloodFill(routers[7].x-35,routers[7].y-20,wh ite); Line(routers[7].x,routers[7].y-50,routers[7].x-35,routers[7].y-20); Circle(routers[7].x-35,routers[7].y-60,8); FloodFill(routers[7].x-35,routers[7].y-60,white); Circle(routers[7].x+15,routers[7].y-70,8); FloodFill(routers[7].x+15,routers[7] .y-70,white); Line(routers[7].x,routers[7].y-50,routers[7].x+15,routers[7].y-70); Line(routers[7].x,routers[7].y-50,routers[7].x-35,routers[7].y-60); SetColor(cyan); OuttextXY(18,routers[1].y-32,'4'); OuttextXY(38,routers[1].y-32,'3');OuttextXY(5 8,routers[1].y-32,'2'); OutTextXY(routers[1].x-48,routers[1].y-48,'FS'); OuttextXY(78,routers[1].y-32,'1'); OutTextXY(routers[1].x+8,routers[1].y+60,'1'); OutTextXY(routers[1].x-50,routers[1].y+60,'6'); OutTextXY(routers[1].x-50,routers[1].y+89,' 5'); OutTextXY(routers[1].x-45,routers[1].y+113,'4'); OutTextXY(routers[1].x-20,routers[1].y+112,'3'); OutTextXY(routers[1].x-28,routers[1].y+82,'hub'); OutTextXY(routers[1].x+11,routers[1].y+111,'2'); OutTextXY(routers[2].x-24,routers[2].y+72,'m odem'); OutTextXY(routers[2].x-26,routers[2].y+98,'1'); OutTextXY(routers[2].x-78,routers[2].y+12,'FS'); OutTextXY(routers[2].x-73,routers[2].y+24,'1'); OutTextXY(routers[2].x-112,routers[2].y+18,'2'); OutTextXY(routers[2].x-142,routers[2].y+18,'3'); OutTextXY(routers[3].x-42,routers[3].y-45,'FS'); OutTextXY(routers[3].x-38,routers[3].y-30,'1'); OutTextXY(routers[3].x-62,routers[3].y-40,'2'); OutTextXY(routers[3].x-82,routers[3].y-40,'3'); Ou tTextXY(routers[4].x-37,routers[4].y-80,'hub'); OutTextXY(routers[4].x-42,routers[4].y-107,'1'); OutTextXY(routers[4].x-62,routers[4].y-73,'2'); OutTextXY(routers[4].x-42,routers[4].y-53,'3'); OutTextXY(routers[4].x+28,routers[4].y-33,'FS'); OutT extXY(routers[4].x+33,routers[4].y-20,'1'); OutTextXY(routers[4].x+55,routers[4].y-27,'2'); OutTextXY(routers[4].x+75,routers[4].y-27,'3'); OutTextXY(routers[4].x+95,routers[4].y-27,'4'); OutTextXY(routers[4].x+115,routers[4].y-27,'5'); OutTextXY (routers[5].x-27,routers[5].y-127,'FS'); OutTextXY(routers[5].x-21,routers[5].y-110,'1'); OutTextXY(routers[5].x-51,routers[5].y-92,'2'); OutTextXY(routers[5].x-51,routers[5].y-122,'3'); OutTextXY(routers[5].x-27,routers[5].y-152,'4'); OutTextXY( routers[5].x,routers[5].y-152,'5'); OutTextXY(routers[6].x-29,routers[6].y-8,'FS'); OutTextXY(routers[6].x-25,routers[6].y+4,'1'); OutTextXY(routers[6].x-44,routers[6].y-2,'2'); OutTextXY(routers[6].x-64,routers[6].y-2,'3'); OutTextXY(routers[6].x-84,routers[6].y-2,'4'); OutTextXY(routers[7].x-7,routers[7].y-48,'FS'); OutTextXY(routers[7].x-2,routers[7].y-35,'1'); OutTextXY(routers[7].x-37,routers[7].y-22,'2'); OutTextXY(routers[7].x-37,routers[7].y-62,'3'); OutText XY(routers[7].x+12,routers[7].y-72,'4'); SetColor(white); OutTextXY(10,230,'Domain 1.1');OutTextXY(10,338,'Domain 1.2'); OutTextXY(200,220,'Domain 2.1');OutTextXY(110,150,'Domain 2.2'); OutTextXY(210,240,'Domain 3.1'); OutTextXY(170,320,'Domain 4 .1');OutTextXY(330,370,'Domain 4.2'); OutTextXY(430,250,'Domain 5.1'); OutTextXY(450,175,'Domain 6.1'); -------------router numbers------------------------- SetColor(black); OutTextXY(routers[1].x-2,routers[1].y-2,'1'); OutTextXY(routers[2] .x-2,routers[2].y-2,'2'); OutTextXY(routers[3].x-2,routers[3].y-2,'3'); OutTextXY(routers[4].x-2,routers[4].y-2,'4'); OutTextXY(routers[5].x-2,routers[5].y-2,'5'); OutTextXY(routers[6].x-2,routers[6].y-2,'6'); OutTextXY(routers[7].x-2,routers[7]. y-2,'7'); if second then begin setlinestyle(0,0,3); setcolor( white green); for i:=1 to OptPathPtr-2 do Line(routers[OptimalPath[i]].x,routers[OptimalPath[i]].y, routers[OptimalPath[i+1]].x,routers[OptimalPath[i+1]].y); while not keypressed do for i:=1 to 63 do SetRGBPalette(green,0,i,0); end; if not second then while not keypressed do for i:=1 to 63 do SetRGBPalette(red,i,0,0); End; Procedure ShowTime(x,y :integer); VAR h, m, s, hund : Word; Function Leadin gZero(w : Word) : String; var s : String; begin Str(w:0,s); if Length(s) = 1 then s := '0' + s; LeadingZero := s; end; Begin GetTime(h,m,s,hund);TextColor(Green);GotoXY(x,y);Write(LeadingZero(h),':', LeadingZero(m),':',LeadingZero(s),'.',Leading Zero(hund)); End; Function Dist (x1,y1,x2,y2:longint):longint; var temp:longint; Begin temp:=sqr(x2-x1)+sqr(y2-y1); temp:=trunc((sqrt(temp))); Dist:=temp; End; -----------------objects implementation part----------------- ---------------Computer procedures--------------- Procedure TComp.Send2Router(batch:TBatch); send batch to it's router VAR i:byte;tmpFrom:TAddr; Begin Delay(DelaySendToRouter); tmpFrom:=batch.from; i:=batch.from.router; routers[i].memory:=batch; router receive data from his domain's computer showtime(wherex,wherey); writeln('> ',tmpFrom.router,'.',tmpFrom.domain,'.',tmpFrom.comp, ' says : I send data ','"',batch.data,'"',' for ',batch.to_.router,'.',batch.to_.domain,'.', batch.to_.comp,' to router',i); for i:=1 to 38 do if (computers[i].addr.router=tmpFrom.router) AND (computers[i].addr.domain=tmpFrom.domain) AND (computers[i].addr.comp=tmpFrom.comp) then break; computers[i].mem.data:=''; clear memory End; Procedure TComp. Send(batch:TBatch); into domain VAR i:byte;tmpTo,tmpFrom:TAddr; Begin Delay(DelayInDomain); tmpTo:=batch.to_;tmpFrom:=batch.from; for i:=1 to 38 do if (computers[i].addr.router=tmpTo.router) AND (computers[i].addr.domain=tmpTo.domain) A ND (computers[i].addr.comp=tmpTo.comp) then break; computers[i].mem:=batch; Send ! showtime(wherex,wherey); writeln('> ',tmpFrom.router,'.',tmpFrom.domain,'.',tmpFrom.comp, ' says : I send data ','"',batch.data,'"',' to ',batch.to_.router,'.',batch.to_.domain,'.', batch.to_.comp); for i:=1 to 38 do if (computers[i].addr.router=tmpFrom.router) AND (computers[i].addr.domain=tmpFrom.domain) AND (computers[i].add r.comp=tmpFrom.comp) then break; computers[i].mem.data:=''; clear memory End; Procedure TComp.Receive(batch:TBatch;byRouter:boolean); computer receive data from his domain's router VAR tmpTo:TAddr; Begin Delay(DelayInDomain); tmpTo:=batch.to_; s howtime(wherex,wherey); write('> ',tmpTo.router,'.',tmpTo.domain,'.',tmpTo.comp, ' says : I receive data ','"',batch.data,'"',' from ',batch.from.router,'.',batch.from.domain,'.', batch.from.comp); if byRouter then writeln(' by router',tmpTo.router ); End; -------------Router procedures------------------- Procedure TRouter.CalcMinPath(sender,target:byte); VAR i,j:byte; k:byte; AllVertexMarked:boolean; Begin ----------------------- Initialization -------------------------- for i:=1 to 7 do for j:=1 to 7 do if AdjacencyMatrix[i,j]=1 then AMatr[i,j].link:=1 else AMatr[i,j].link:=0; for i:=1 to 7 do for j:=1 to 7 do AMatr[i,j].weight:=0; Randomize; For j:=2 to7 do for i:=1 to j-1 do AMatr[i,j].weight:=rand om(50); for i:=1 to 7 do vertexArr[i].marked:=false; -------------------------- Make marks ----------------------------- ---- mark last vertex ---- vertexArr[target].mark.delta:=0;vertexArr[target].mark.prevPtr:=target; vertexArr[target] .marked:=true; AllVertexMarked:=false; While not AllVertexMarked do BEGIN For j:=1 to 7 do For i:=1 to 7 do begin j--->i if (AMatr[i,j].link<>0) AND (vertexArr[j].marked) AND (not vertexArr[i].marked) then begin if not ((vertexArr[j].marked) AND (j=sender)) then begin vertexArr[i].mark.delta:=vertexArr[j].mark.delta+AMatr[j,i].weight; vertexArr[i].mark.prevPtr:=j; vertexArr[i].marked:=true; end; end; End; AllVertexMarked:=true; for i:=1 to 7 do if vertexArr[i].marked=false then AllVertexMarked:=false; END; While not AllVertexMarked -------------------------- Main test ----------------------------- for i:=1 to 49 do OptimalPath[i]:=0; For i:=1 to 7 do vertexAr r[i].marked:=false; vertexArr[sender].marked:=true; For j:=1 to 7 do For i:=1 to 7 do begin ---- deltaA-deltaB > d(AB) then change mark if (vertexArr[j].marked) AND (not(vertexArr[i].marked)) then begin vertexArr[i].marked:=true; for k:=1 to 7 do if (AMatr[k,j].link=1) then begin if vertexArr[j].mark.delta-vertexArr[k].mark.delta>AMatr[k,j].weight then begin vertexArr[j].mark.prevPtr:=k; vertexArr[j].mark.delta:=vertexArr[k].mark.delta+AMatr[k,j].weight; vertexArr[ k].marked:=true; end else vertexArr[k].marked:=true ; end; end; end; if adjacency vertex found push(sender); k:=vertexArr[sender].mark.prevPtr; push(k); While k<>target do begin push(vertexArr[k].mark.PrevPtr); k:=vertexArr[k].mark.PrevPtr; End; End; Procedure TRouter.Send2NextRouter(batch:TBatch;currentRouter:byte); Begin Delay(DelayRouterReceive+AMatr[currentRouter,OptimalPath[OptPathPtr]].link); showtime(wherex,wherey); writeln('> router',currentR outer, ' says : I send data ','"',batch.data,'"',' from ',batch.from.router,'.',batch.from.domain,'.', batch.from.comp,' to router',OptimalPath[OptPathPtr]); routers[OptimalPath[OptPathPtr]].memory:=batch; inc(OptPathPtr); routers[currentRouter]. memory.data:='' clear memory End; Procedure TRouter.receive(routerNum:byte;batch:TBatch); Begin Delay(DelayRouterReceive); showtime(wherex,wherey); writeln('> router',routerNum, ' says : I receive data ','"',batch.data,'"',' from ',batch.from.rou ter,'.',batch.from.domain,'.', batch.from.comp); End; Procedure TRouter.send2comp(batch:TBatch); VAR i:byte;tmpTo,tmpFrom:TAddr; Begin Delay(DelayInDomain); tmpTo:=batch.to_;tmpFrom:=batch.from; for i:=1 to 38 do if (computers[i].addr.router=tmpTo.router) AND (computers[i].addr.domain=tmpTo.domain) AND (computers[i].addr.comp=tmpTo.comp) then break; computers[i].mem:=batch; Send ! showtime(wherex,wherey); writeln('> router',tmpTo.router, ' says : I send data ','"',batch.data,'"',' to ',batch.to_.router,'.',batch.to_.domain,'.', batch.to_.comp); routers[tmpTo.router].memory.data:=''; clear memory End; Procedure Initialization; VAR i,j:integer; Begin ------------- INITIALIZATION PART ------------- FOR i:=1 to 7 do begin routers initialization routers[i].num:=i;routers[i].state:=true; routers[i].memory.data:=''; for j:=1 to 20 do routers[i].memory.path[j]:=0; END; routers[1].x:=120;routers[1].y:=300; routers[2].x: =250;routers[2].y:=100; routers[3].x:=320;routers[3].y:=300; routers[4].x:=300;routers[4].y:=420; routers[5].x:=500;routers[5].y:=420; routers[6].x:=540;routers[6].y:=200; routers[7].x:=550;routers[7].y:=100; FOR i:=1 to 38 do computers[i].mem.data:=''; computers initialization j:=1; for i:=1 to 4 do begin router 1, domain 1 computers[i].addr.router:=1;computers[i].addr.domain:=1; computers[i].addr.comp:=j;inc(j); end; j:=1; for i:=5 to 10 do begin ro uter 1, domain 2 computers[i].addr.router:=1;computers[i].addr.domain:=2; computers[i].addr.comp:=j;inc(j); end; router 2, domain 1 computers[11].addr.router:=2;computers[11].addr.domain:=1;computers[11].addr.comp:=1; j:=1; for i:=12 to 14 do begin router 2, domain 2 computers[i].addr.router:=2;computers[i].addr.domain:=2; computers[i].addr.comp:=j;inc(j); end; j:=1; for i:=15 to 17 do begin router 3, domain 1 computers[i].addr.router:=3;computers[i].addr .domain:=1; computers[i].addr.comp:=j;inc(j); end; j:=1; for i:=18 to 20 do begin router 4, domain 1 computers[i].addr.router:=4;computers[i].addr.domain:=1; computers[i].addr.comp:=j;inc(j); end; j:=1; for i:=21 to 25 do begin router 4, domain 2 computers[i].addr.router:=4;computers[i].addr.domain:=2; computers[i].addr.comp:=j;inc(j); end; j:=1; for i:=26 to 30 do begin router 5, domain 1 computers[i].addr.router:=5;computers[ i].addr.domain:=1; computers[i].addr.comp:=j;inc(j); end; j:=1; for i:=31 to 34 do begin router 6, domain 1 computers[i].addr.router:=6;computers[i].addr.domain:=1; computers[i].addr.comp:=j;inc(j); end; j:=1; for i:=35 to 3 8 do begin router 7, domain 1 computers[i].addr.router:=7;computers[i].addr.domain:=1; computers[i].addr.comp:=j;inc(j); end; ------------- END OF INITIALIZATION PART ------------- End; Procedure Error(ErrorNum:byte); Begin textcolor(l ightred); writeln(' Error !'); case ErrorNum of 1: writeln(' One (or two) of above addresses are not exist'); 2: writeln(' FROM and TO are same'); end; readln;halt; End; VAR tmpStr :string; tmpFrom :TAddr; tmpTo :TAddr; tmpData :string; i,j :integer; tmpX,tmpY:integer; FromNum,ToNum:byte; index FROM and TO computers in array BEGIN ------------- MAIN PROGRAM --------------- Initialization; ShowGraphics(false);readln;CloseGraph; ClrScr;TextColor(LightG reen); write(' Global Network Emulation ');ShowTime(70,1);writeln; ------------- ADDRESS AND DATA REQUEST --------------- Write(' Enter FROM address (X.X.X) : ');readln(tmpStr); FROM request------- Val(tmpStr[1],tmpFrom.router,i);Val(tmpStr[ 3],tmpFrom.domain,i); Val(tmpStr[5],tmpFrom.comp,i); target request----------------------------- Write(' Enter TO address (X.X.X) : ');readln(tmpStr); Val(tmpStr[1],tmpTo.router,i);Val(tmpStr[3],tmpTo.domain,i); Val(tmpStr[5],tmpTo.comp,i); Write(' Enter string-type DATA : ');readln(tmpData); ------------- SEARCH 'FROM' TERMINAL ------------------- for i:=1 to 38 do if (computers[i].addr.router=tmpFrom.router) AND (computers[i].addr.domain=tmpFrom.domain) AND (computers[i].addr.comp=tmpFrom.comp) then FromNum:=i; ------------- SEARCH 'TO' TERMINAL ---------------------- for i:=1 to 38 do if (computers[i].addr.router=tmpTo.router) AND (computers[i].addr.domain=tmpTo.domain) AND (compu ters[i].addr.comp=tmpTo.comp) then ToNum:=i; if (FromNum=0) OR (ToNum=0) then Error(1); if FromNum=ToNum then Error(2); computer cannot send batch to itself ------------- FILL 'ADDRESS' FIELDS----------------------- computers[FromNum].mem.to _.router:=tmpTo.router; computers[FromNum].mem.to_.domain:=tmpTo.domain; computers[FromNum].mem.to_.comp:=tmpTo.comp; computers[FromNum].mem.from.router:=tmpFrom.router; computers[FromNum].mem.from.domain:=tmpFrom.domain; computers[FromNum] .mem.from.comp:=tmpFrom.comp; ------------- FILL DATA FIELDS----------------------- computers[FromNum].mem.data:=tmpData; writeln; OptPathPtr:=0; if computers[FromNum].mem.from.router<>computers[FromNum].mem.to_.router then routers[tm pFrom.router].CalcMinPath(tmpFrom.router,tmpTo.router); OptPathPtr:=2; WHILE TRUE DO BEGIN -------------- GLOBAL NET SCANNING ------------------ for i:=1 to 38 do ------scanning terminals for data for sending -------- if computers[i].mem .data<>'' then begin if (computers[i].addr.router=computers[i].mem.to_.router) AND (computers[i].addr.domain=computers[i].mem.to_.domain) AND (computers[i].addr.comp<>computers[i].mem.to_.comp) then begin computers[i].send(computers[i].mem); into domain sending break; end else if (computers[i].addr.router<>computers[i].mem.to_.router) OR (computers[i].addr.domain<>computers[i].mem.to_.domain) then computers[i].Send2Router(computers[i] .mem); send to router end; if data for sending found for i:=1 to 7 do ------scanning routers for receiving data if routers[i].memory.data<>'' then begin routers[i].receive(i,routers[i].memory); if routers[i].memory.to_.router=i the n begin if send into domain routers[i].send2comp(routers[i].memory); break; end else begin routers[i].send2nextRouter(routers[i].memory,i); break; end; end; ------------------------------- for i:=1 to 38 do --- ---scanning terminals for receiving data if computers[i].mem.data<>'' then begin if (computers[i].addr.router=computers[i].mem.to_.router) AND (computers[i].addr.domain=computers[i].mem.to_.domain) then begin into domain receiving computers[i].receive(computers[i].mem,false); break; end; --------------------- computers[i].receive(computers[i].mem,true); receiving from router break; end; if receive data found for i:=1 to 38 do if (computers[i].mem.data<> '') AND(computers[i].addr.router=computers[i].mem.to_.router) AND (computers[i].addr.domain=computers[i].mem.to_.domain) AND (computers[i].addr.comp=computers[i].mem.to_.comp) then while true do begin ---------Batch received !--------- HiddenCursor; tmpX:=wherex;tmpY:=whereY; ShowTime(70,1); gotoXY(tmpX,tmpY); if keypressed then begin readkey; ShowGraphics(true); readln; CloseGraph; NormVideo; NormalCursor; hal t; end; end; tmpX:=wherex;tmpY:=whereY; ShowTime(70,1); gotoXY(tmpX,tmpY); END; -------------- END OF GLOBAL NET SCANNING --------------------------- END.
1Архитектура и строительство
2Астрономия, авиация, космонавтика
 
3Безопасность жизнедеятельности
4Биология
 
5Военная кафедра, гражданская оборона
 
6География, экономическая география
7Геология и геодезия
8Государственное регулирование и налоги
 
9Естествознание
 
10Журналистика
 
11Законодательство и право
12Адвокатура
13Административное право
14Арбитражное процессуальное право
15Банковское право
16Государство и право
17Гражданское право и процесс
18Жилищное право
19Законодательство зарубежных стран
20Земельное право
21Конституционное право
22Конституционное право зарубежных стран
23Международное право
24Муниципальное право
25Налоговое право
26Римское право
27Семейное право
28Таможенное право
29Трудовое право
30Уголовное право и процесс
31Финансовое право
32Хозяйственное право
33Экологическое право
34Юриспруденция
 
35Иностранные языки
36Информатика, информационные технологии
37Базы данных
38Компьютерные сети
39Программирование
40Искусство и культура
41Краеведение
42Культурология
43Музыка
44История
45Биографии
46Историческая личность
47Литература
 
48Маркетинг и реклама
49Математика
50Медицина и здоровье
51Менеджмент
52Антикризисное управление
53Делопроизводство и документооборот
54Логистика
 
55Педагогика
56Политология
57Правоохранительные органы
58Криминалистика и криминология
59Прочее
60Психология
61Юридическая психология
 
62Радиоэлектроника
63Религия
 
64Сельское хозяйство и землепользование
65Социология
66Страхование
 
67Технологии
68Материаловедение
69Машиностроение
70Металлургия
71Транспорт
72Туризм
 
73Физика
74Физкультура и спорт
75Философия
 
76Химия
 
77Экология, охрана природы
78Экономика и финансы
79Анализ хозяйственной деятельности
80Банковское дело и кредитование
81Биржевое дело
82Бухгалтерский учет и аудит
83История экономических учений
84Международные отношения
85Предпринимательство, бизнес, микроэкономика
86Финансы
87Ценные бумаги и фондовый рынок
88Экономика предприятия
89Экономико-математическое моделирование
90Экономическая теория

 Анекдоты - это почти как рефераты, только короткие и смешные Следующий
Раньше жена вечерами учила меня жить. Купил ей ноутбук, подключил интернет. Теперь учит других!
Anekdot.ru

Узнайте стоимость курсовой, диплома, реферата на заказ.

Обратите внимание, диплом по программированию "Проектирование и разработка сетевых броузеров на основе теоретико-графовых моделей", также как и все другие рефераты, курсовые, дипломные и другие работы вы можете скачать бесплатно.

Смотрите также:


Банк рефератов - РефератБанк.ру
© РефератБанк, 2002 - 2016
Рейтинг@Mail.ru