Система дистанционного обучения работе на компьютере

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 28.04.2014
Размер файла 2,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru

Размещено на http://www.allbest.ru

Содержание

Введение

1. Аналитический раздел

1.1 Архитектура технологий TCP/IP

1.2 Описание Windows Sockets

2. Конструкторский раздел

2.1 Функциональная схема программного комплекса

2.2 Инициализация и работа сокет-сервера

2.3 Инициализация и работа сокет-клиента

2.4 Передача данных

2.5 Управление мышью и клавиатурой

2.6 Передача изображения экрана

3. Технологический раздел

3.1 Выбор средств разработки

3.2 Структура программы

3.3 Системные требования

3.4 Интерфейс пользователя

3.5 Руководство по установке

3.6 Руководство администратора

3.7 Руководство пользователя

3.7.1 Руководство преподавателя

3.7.2 Руководство ученика

4. Экспериментальный раздел

4.1 Скорость передачи данных

4.2 Сжатие изображения

Заключение

Введение

В настоящее время персональные компьютеры (далее ПК), а также всевозможные сетевые соединения ПК становятся неотъемлемой частью жизни людей. Процесс компьютеризации толкает людей, которые раньше не нуждались в использование ПК, к вовлечению компьютера в свою работу и организацию досуга. Становится, практически, невозможным не использовать такие современные средства коммуникации, как электронная почта, программы для общения через сеть интернет (например ICQ, Miranda), факс и многие другие.

Современные программы и операционные системы стремятся к интуитивной организации управления. Под интуитивной организацией управления подразумевается более простое управление с точки зрения пользователя, но, как правило, чем проще управление для пользователя, тем сложнее организация программы с точки зрения программиста, и тем больше ресурсов компьютера потребляет программа. Возможно, когда-нибудь программы и операционные системы станут настолько просты, что пользователь только по встроенным обучающим программам и справке сможет освоить их, но на сегодняшний день это не так. Поэтому вопрос об организации обучения компьютерным технологиям весьма актуален. Чтобы научиться работать на компьютере (подразумевается просто использование ПК, не обязательно для работы) нужно все навыки осваивать на практике. Большинство компьютерных курсов не предоставляют столько практических занятий, сколько необходимо для успешного освоения работы на ПК. Конечно, если вооружиться справочной литературой и долго практиковаться, то любой человек рано или поздно научится работать на компьютере. У молодого поколения таких проблем, практически, нет, уже родившиеся в компьютерную эру, они с детства впитали в себя логику управления программ. Но старшему поколению это дается намного сложнее, потому что они воспитывались и выросли в другое время, и сейчас, когда произошел информационный взрыв, они с трудом адаптируются к новым технологиям. Из-за внедрения компьютерных технологий многие хорошие специалисты оказались не нужны, они не смогли освоить новые технологии работы. Они, конечно, не остались без работы, большинство из них сменило профессию, а кто-то, возможно, работает просто с меньшей производительностью, чем, если бы он работал, используя новые технологии.

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

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

Стек протоколов TCP/IP давно стал стандартом в сетевых технологиях, он содержит самые распространенные протоколы, поэтому если программа написана для работы средствами TCP/IP, то, очевидно, она сможет найти применение, практически, везде. Именно по этим причинам данный проект и был разработан для работы через стек TCP/IP.

Основные требования к системе:

1. Настроенная компьютерная сеть

2. Два компьютера через сетевые карты подключены к сети

3. ОС с поддержкой Windows sockets 1.1 и выше

4. Компьютеры (минимальные требования: Pentium3 800 Mhz, 64 Mb RAM)

1. Аналитический раздел

1.1 Архитектура технологий TCP/IP

Протоколы сетевого взаимодействия TCP/IP являются результатом эволюционного развития протоколов глобальной вычислительной сети ARPANET. Работы по созданию сети ARPANET были начаты рядом университетов США и фирмой BBN в 1968 г. В 1971 г. сеть была введена в регулярную эксплуатацию и обеспечивала для всех своих узлов три основные услуги:

1. интерактивный вход пользователя на удаленный узел;

2. передача файлов между узлами сети;

3. электронная почта.

Все эти средства базировались на транспортных услугах предоставляемых программой управления сети NCP (Network Control Program), реализующей свой внутренний набор протоколов. Накопленный к 1974 г. опыт эксплуатации сети ARPANET выявил многие недостатки протоколов NCP и позволил определить основные требования к новому набору протоколов, получившему название TCP/IP:

1. независимость от среды передачи сообщений;

2. возможность подключения к сети ЭВМ любой архитектуры;

3. единый способ организации соединения между узлами в сети;

4. стандартизация прикладных протоколов.

Широко используемая ныне версия 4 протоколов TCP/IP была стандартизирована в 1981 г. в виде документов, называемых RFC (Request For Comment). Полный переход сети ARPANET на новые протоколы был завершен в 1982 г. Эта сеть сыграла роль "зародыша" всемирной сети Internet, построенной на базе протоколов TCP/IP. Реализация протоколов TCP/IP оказалась наиболее удачной в версиях BSD4.2 и BSD4.3 операционной системы UNIX. Эта реализация является эталоном (стандартом "de facto") для всех последующих.

В 1984 г. международная стандартизирующая организация ISO предложила модель взаимодействия открытых систем OSI (Open System Interconnection), являющуюся удобным средством описания стеков протоколов.

На табл. 1.1 представлено соотношение четырехуровневой архитектуры протоколов TCP/IP и семиуровневой архитектуры OSI.

Табл. 1.1

Уровни OSI/ISO

Уровни TCP/IP

Прикладной

Прикладной

(Application)

Представительский

Сеансовый

Транспортный

Транспортный (Transmission)

Сетевой

Межсетевой (Internetwork)

Канальный

Сетевой

(Network)

Физический

Объединение канального и физического уровней модели OSI в единый сетевой уровень TCP/IP было обусловлено требованием независимости от используемой среды передачи данных. Дело в том, что функции протоколов канального и физического уровней реализуются в настоящее время, как правило, едиными техническими средствами (сетевыми контроллерами).

Согласно терминологии TCP/IP элементы сетевого уровня называются подсетями (subnetworks). Идеология TCP/IP допускает, чтобы в качестве "подсетей" выступали реальные сети с их собственными стеками протоколов, узлами, шлюзами и т.п.

2. Архитектура протоколов TCP/IP

На табл. 2.1 представлена архитектура основных протоколов TCP/IP, используемых на трех нижних уровнях стека.

Табл. 1.2

Транспортный уровень

TCP, UDP

Межсетевой уровень

IP, ICMP

Сетевой уровень

Ethernet, X.25, Token Ring

Краеугольным камнем всей архитектуры является межсетевой протокол IP (Internet Protocol). С его помощью реализуется адресация узлов сети и доставка данных. Межсетевой протокол управляющих сообщений ICMP (Internet Control MessageProtocol) предназначен для передачи диагностической информации и сообщений об ошибках в работе сети. Примечание. Протокол ICMP отнесен к межсетевому уровню условно, т.к., с одной стороны, он пользуется возможностями протокола IP для транспортировки собственных данных, но, с другой стороны, сам для транспортировки данных пользователя не применяется. Двумя основными протоколами транспортного уровня являются надежный протокол управления передачей данных TCP (Transmission Control Protocol) и быстрый протокол дейтаграмм пользователя UDP (User Datagram Protocol). TCP реализует сетевое взаимодействие в режиме с установлением логического (виртуального) соединения, а UDP - без оного. Функции каждого протокола реализуются компонентой программного обеспечения (обычно входящей в состав операционной системы), которую будем называть модулем.

Взаимодействие модулей соседних уровней осуществляется через стандартизированный интерфейс, имеющий, как правило, процедурный характер. На каждом уровне стека протоколов TCP/IP обмен данными ведется блоками данных конечной длины. К сожалению, отсутствует устоявшаяся терминология в обозначении этих блоков. В данной РПЗ названия блоков данных зависят от уровня стека протоколов, как это показано ниже.

Табл. 1.3

Уровень

Название блоков данных

Транспортный

Пакет

Межсетевой

Сегмент

Сетевой

Кадр

Межсетевой протокол IP специфицирован в RFC 791. Его основные характеристики перечислены ниже:

1. реализует обмен информации пакетами, которые будем называть IP-сегментами (максимальный размер IP-сегмента - 65535 байт);

2. является протоколом взаимодействия без установления логического соединения;

3. для адресации узлов сети используется адрес длиной 4 байта;

4. обеспечивает в случае необходимости фрагментацию IP-сегментов;

5. IP-сегменты имеют конечное время жизни в сети;

6. не гарантирует надежность доставки IP-сегментов адресату;

7. не имеет средств управления интенсивностью передачи IP-сегментов посылающей стороной (flow control);

8. не гарантирует правильную последовательность IP-сегментов на принимающей стороне.

Протокол управления передачей TCP (Transmission Control Protocol) является протоколом транспортного уровня и базируется на возможностях, предоставляемых межсетевым протоколом IP. Основная задача TCP - обеспечение надежной передачи данных в сети. Его транспортный адрес в заголовке IP-сегмента равен 6. Описание протокола TCP дано в RFC 793.

Его основные характеристики перечислены ниже:

1. реализует взаимодействие в режиме с установлением логического (виртуального) соединения;

3. обеспечивает двунаправленную дуплексную связь;

4. организует потоковый (с точки зрения пользователя) тип передачи данных;

5. дает возможность пересылки части данных, как "экстренных";

6. для идентификации партнеров по взаимодействию на транспортном уровне использует 16-битовые "номера портов";

7. реализует принцип "скользящего окна" (sliding window) для повышения скорости передачи;

8. поддерживает ряд механизмов для обеспечения надежной передачи данных.

Несмотря на то, что для пользователя передача данных с использованием протокола TCP выглядит как потоковая, на самом же деле обмен между партнерами осуществляется посредством пакетов данных, которые мы будем называть

Протокол дейтаграмм пользователя UDP (User Datagram Protocol) является протоколом транспортного уровня и базируется на возможностях, предоставляемых межсетевым протоколом IP. Основная задача UDP - обеспечение "быстрой" передачи данных в сети. Его транспортный адрес в заголовке IP-сегмента равен 17. Описание протокола UDP дано в RFC 768.

Его основные характеристики перечислены ниже:

1. реализует взаимодействие в режиме без установления логического (виртуального) соединения;

3. организует поблочный (дейтаграмный, пакетный) тип передачи данных;

4. для идентификации партнеров по взаимодействию на транспортном уровне использует 16-битовые "номера портов";

6. не гарантирует надежной передачи данных (возможна как потеря UDP-пакетов, так и их дублирование);

7. не имеет средств уведомления источника UDP-пакета о правильности/ошибочности в его приеме адресатом;

8. не обеспечивает правильный порядок доставки UDP-пакетов от источника к приемнику;

9. может гарантировать целостность данных в UDP-пакете за счет использования контрольной суммы;

10. очень прост (особенно, по сравнению с протоколом TCP).

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

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

1.2 Описание Windows Sockets

Для программирования установления соединения и обмена данными с помощью технологий TCP/IP наиболее удобным является компонента OS Windows - Windows Sockets (далее WS). WS - это низкоуровневый API, позволяющий программисту создавать в OS Windows приложения, работающие как с проводными, так и беспроводными сетями. (4) WS снабжают разработчиков удобным интерфейсом для обмена данными между удаленными устройствами. Необязательно, чтобы на удаленном устройстве была установлена OS Windows - главное, чтобы его OS поддерживала сокеты.

Архитектура WS представлена на Рис.1.1

Рис.1.1 Архитектура WS (источник - www.msdn.microsoft.com)

Из данной схемы видно, что в WS существует два вида сервиса - Transport и Name Space. Примерами обеспечения Transport service могут быть различные стеки - TCP/IP, Bluetooth и.т.д., которые обеспечивают корректную передачу данных с использованием соответствующих сетевых протоколов. Примером Name Space service provider может служить интерфейс Domain Naming System (DNS), позволяющий задавать символьные имена компьютерам в сети.

Сокет - это модель одного конца соединения, со всеми присущими ему свойствами и методами. По сути, это прикладной программный интерфейс, входящий в состав многих операционных систем (ОС) и призванный для поддержки сетевых возможностей ОС. В стандарте структуры протоколов семиуровневой модели OSI-сокеты лежат на так называемом транспортном уровне. В Windows поддержка сокетов включена начиная с версии 3.11.

Прикладной интерфейс Windows Sockets состоит из DLL Ws2_32.dll, которая обеспечивает приложениям доступ к Winsock-функциям (см. рис. 1.2). Ws2_32.dll вызывает сервисы пространства имен и провайдеров сервисов транспорта для выполнения операций по разрешению имен и передачи сообщений. Библиотека Msafd.dll действует как провайдер сервисов транспорта. Msafd.dll использует библиотеки-помощники для Winsock (которые являются специфичными для протоколов), для взаимодействия с драйверами протоколов уровня ядра. Например, Wshtcpip.dll является помощником для протокола TCP/IP, а Wshnetbs.dll - для протокола NetBEUI. Библиотека Mswsock.dll реализует расширенную функциональность Microsoft Winsock.

Провайдер сетевого транспорта Msafddll использует сервисы драйвера файловой системы AFD.sys (Ancillary Function driver, AFD) для реализации функций сокетов. AFD является TDI-клиентом и исполняет сетевые операции с сокетами, такие как посылка и получение сообщений, путем отправки запросов TDI IRP драйверам протоколов. AFD не запрограммирован для использования определенных драйверов протоколов, поэтому Msafd.dll информирует AFD об имени протокола, используемого определенным сокетом, так чтобы AFD мог открыть объект-устройство, представляющее этот протокол.

Рис.1.2 схема интерфейса WS (источник-библиотека русифицированной документации www.hardline.ru)

2. Конструкторский раздел

2.1 Функциональная схема программного комплекса

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

Рис. 2.1 Схема взаимодействия преподавателя и ученика

Теперь когда ясны функции и порядок действий ученика и преподавателя можно думать над программным решением задачи.

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

Рис. 2.2 Функциональная схема программного комплекса

Первоначальным этапом разработки комплекса программ было составление функциональной схемы, то есть распределение между двумя приложениями основных функций, которое позволит решить поставленную задачу. Функциональная схема данного программного комплекса представлена на Рис. 2.2. Из схемы следует, что главными функциями серверного приложения являются ожидание соединения, формирование и отправка программе-клиенту команд для управления мышью и клавиатурой, прием изображения экрана клиента и отображение его в окне программы сервера. Основными функциями клиента являются: прием и обработка команд от сервера, отправка изображения экрана серверу.

2.2 Инициализация и работа сокет-сервера

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

Схема работы сервера изображена на рисунке 2.3.

Рис.2.3 Схема работы программы-сервера

Для того чтобы использовать WS (а точнее, ws2_32.dll), в приложении необходимо вызвать функцию:

int WSAStartup(WORD Ошибка! Недопустимый объект гиперссылки., LPWSADATA Ошибка! Недопустимый объект гиперссылки.);

Первый аргумент - версия WS, используемая приложением. Второй - структура, содержащая информацию о текущей конфигурации WS, например: максимальное количество сокетов (игнорируется, начиная с WS 2.0), последняя доступная версия WS, общая информация о реализации WS, доступной на данной ПЭВМ. Функция возвращает ноль в случае успеха, а в случае неудачи возвращаются коды ошибок:

WSASYSNOTREADY - физические сетевые устройства не готовы к использованию

WSAVERNOTSUPPORTED - запрошенная версия WS не поддерживается

WSAEINPROGRESS - для версий 1.1 и младше - запущен блокировочный процесс

WSAEPROCLIM - превышен лимит количества задач, выполняемых WS-системой

WSAEFAULT - второй параметр является неправильным указателем

После завершения использования приложением функций WS необходимо вызывать функцию:

int WSACleanup(void);

Данная функция отменяет использование ws2_32.dll данным процессом. Возвращает ноль в случае успеха, а в случае ошибки возвращаются следующие коды:

WSANOTINITIALISED - не была вызвана и успешно выполнена WSAStartup

WSAENETDOWN - сбой в работе сети

WSAEINPROGRESS - для версий 1.1 и младше - запущен блокировочный процесс

После успешного вызова WSAStartup можно приступать к созданию сокета при помощи функции:

SOCKET socket(int Ошибка! Недопустимый объект гиперссылки., int Ошибка! Недопустимый объект гиперссылки.,int Ошибка! Недопустимый объект гиперссылки.);

Первый аргумент - тип адреса. Для создания TCP/IP-сокета необходимо указать AF_INET.

Второй аргумент - тип сокета. Существует два типа сокетов - SOCK_STREAM (надежные, упорядоченные, полнодуплексные потоки байтов в режиме с установлением соединения) и SOCK_DGRAM(передача данных в виде дейтаграмм в режиме без установления соединения) В данном проекте используются сокеты первого типа, в силу удобства работы с ними и необходимости в оперативном обмене данными.

Третий аргумент - протокол, используемый для передачи данных, связанный с типом адреса. Для стека TCP/IP задается нулевое значение.

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

Перед использованием вы должны задать параметры сокета. Для этого нужно подготовить структуру типа sockaddr_in, определение которой показано ниже:

struct sockaddr_in

{

short sin_family;

u_short sin_port;

struct in_addr sin_addr;

char sin_zero[8];

};

typedef struct sockaddr_in SOCKADDR _IN;

typedef struct sockaddr_in *PSOCKADDR _IN;

typedef struct sockaddr_in FAR *LPSOCKADDR _IN;

Поле sin_family определяет тип адреса. Вы должны записать в это поле значение AF_INET, которое соответствует типу адреса, принятому в Internet:

srv_address.sin_family = AF_INET;

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

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

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

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

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

Ниже мы показали, как инициализируется поле sin_port в приложении SERVER, описанном далее:

#define SERV_PORT 5000

srv_address.sin_port = htons(SERV_PORT);

Вернемся снова к структуре sockaddr_in. Поле sin_addr этой структуры представляет собой структуру in_addr:

struct in_addr

{

union

{

struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;

struct { u_short s_w1,s_w2; } S_un_w;

u_long S_addr;

} S_un;

};

#define s_addr S_un.S_addr

#define s_host S_un.S_un_b.s_b2

#define s_net S_un.S_un_b.s_b1

#define s_imp S_un.S_un_w.s_w2

#define s_impno S_un.S_un_b.s_b4

#define s_lh S_un.S_un_b.s_b3

При инициализации сокета в этой структуре нужно указать адрес IP, с которым будет работать данный сокет. Если сокет будет работать с любым адресом (например, вы создаете сервер, который будет доступен из узлов с любым адресом), адрес для сокета можно указать следующим образом:

srv_address.sin_addr.s_addr = INADDR_ANY;

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

Если известен адрес в виде четырех десятичных чисел, разделенных точкой (именно так его вводит пользователь), то можно заполнить поле адреса при помощи функции inet_addr:

dest_sin.sin_addr.s_addr = inet_addr ("200.200.200.201");

В случае ошибки функция возвращает значение INADDR_NONE, что можно использовать для проверки.

В данном проекте сервер настраивается на ожидание соединения с любого адреса, а на приложение-клиенте задается доменное имя сервера. Для преобразования доменного имени в адрес используется функция gethostbyname, возвращающая адрес IP:

PHOSTENT phe;

phe = gethostbyname (server_name);

if(phe == NULL)

{

closesocket (srv_socket);

MessageBox(NULL, "gethostbyname Error", "Error", MB_OK);

return;

}

memcpy((char FAR *)&(dest_sin.sin_addr),

phe->h_addr, phe->h_length);

В случае ошибки функция gethostbyname возвращает NULL. При этом причину ошибки можно выяснить, проверив код возврата функции WSAGetLastError.

Если же указанный узел найден в базе DNS или в файле HOSTS, функция gethostbyname возвращает указатель на структуру hostent, описанную ниже:

struct hostent

{

char FAR * h_name; // имя узла

char FAR * FAR * h_aliases; // список альтернативных имен

short h_addr type; // тип адреса узла

short h_length; // длина адреса

char FAR * FAR * h_addr _list; // список адресов

#define h_addr h_addr_list[0] // адрес

};

typedef struct hostent *PHOSTENT;

typedef struct hostent FAR *LPHOSTENT;

Искомый адрес находится в первом элемента списка h_addr _list[0], на который можно также ссылаться при помощи h_addr. Длина поля адреса находится в поле h_length.

После того как вы подготовили структуру SOCKADDR, записав в нее параметры сокета (в частности, адрес), следует выполнить привязку адреса к сокету при помощи функции bind:

int bind (SOCKET sock, const struct sockaddr FAR * addr, int namelen);

Параметр sock должен содержать дескриптор сокета, созданного функцией socket. В поле addr следует записать указатель на подготовленную структуру SOCKADDR, а в поле namelen - размер этой структуры. В случае ошибки функция bind возвращает значение SOCKET_ERROR. Дальнейший анализ причин ошибки следует выполнять при помощи функции WSAGetLastError. Пример вызова функции bind показан ниже:

if(bind (srv_socket, (LPSOCKADDR)&srv_address,

sizeof(srv_address)) == SOCKET_ERROR)

{

closesocket (srv_socket);

MessageBox(NULL, "bind Error", "Error", MB_OK);

return;

}

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

Прежде всего, нужно переключить сокет в режим приема для выполнения ожидания соединения с клиентом при помощи функции listen:

int listen(SOCKET sock, int backlog);

Через параметр sock функции необходимо передать дескриптор сокета, который будет использован для создания канала. Параметр backlog задает максимальный размер очереди для ожидания соединения (можно указывать значения от 1 до 5). Очередь содержит запросы на установку соединений для каждой пары значений (адрес IP, порт).

Далее необходимо выполнить ожидание соединения. Это можно выполнить двумя различными способами. Первый способ заключается в циклическом вызове функции accept до тех пор, пока не будет установлено соединение. Затем можно будет приступать к обмену данными.

Функция accept имеет следующий прототип:

SOCKET accept (SOCKET sock, struct sockaddr FAR * addr,

int FAR * addrlen);

Через параметр sock необходимо указать дескриптор сокета, который находится в режиме приема для выполнения ожидания. Параметр addr должен содержать адрес буфера, в который будет записан адрес узла, подключившегося к серверу. Размер этого буфера необходимо указать в переменной типа int, адрес которой передается через параметр addrlen.

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

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

#define WSA_ACCEPT (WM_USER + 1)

// При попытке установки соединения главное окно приложения

// получит сообщение WSA_ACCEPT

rc = WSAAsyncSelect (srv_socket, hWnd, WSA_ACCEPT, FD_ACCEPT);

if(rc > 0)

{

closesocket (srv_socket);

MessageBox(NULL, "WSAAsyncSelect Error", "Error", MB_OK);

return;

}

В данном случае ожидание соединения выполняется для сокета srv_socket. Последний параметр функции имеет значение FD_ACCEPT. Это означает, что при попытке создания канала связи функция окна с идентификатором hWnd получит сообщение WSA_ACCEPT, определенное в вашем приложении.

Обработчик сообщения WSA_ACCEPT вначале вызывает функцию accept, выполняющую создание канала передачи данных. После этого функция WSAAsyncSelect вызывается еще один раз, для того чтобы установить асинхронную обработку приема данных от удаленного клиента, а также обработку ситуации разрыва канала связи.

2.3 Инициализация и работа сокет-клиента

дистанционное обучение работа компьютер

Работа по подключению со стороны клиента несколько проще, чем работа по подключению со стороны сервера (см. Рис.2.3). Инициализация WS и создание сокета происходит аналогично клиентскому приложению. Заполнение структуры производится почти также, но нужно указать теперь IP адрес сервера (пример 192.168.0.10). Удобней задавать доменное имя сервера, чем его IP адрес, для преобразования можно использовать функцию gethostbyname. Дальше сразу можно соединяться:

connect(s, (struct sockaddr *)&anAddr, sizeof(struct sockaddr));

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

int connect (SOCKET s, struct sockaddr_in * addr, int addrlen)

Аргумент s задает дескриптор socket'а, через который программа обращается к серверу с запросом на соединение. Socket должен быть предварительно создан системным вызовом socket и обеспечен адресом с помощью системного вызова bind. Аргумент addr должен указывать на структуру данных, содержащую адрес, приписанный socket'у программы-сервера, к которой делается запрос на соединение. Аргумент addrlen задает размер (в байтах) структуры данных, указываемой аргументом addr.

Для того, чтобы запрос на соединение был успешным, необходимо, по крайней мере, чтобы программа-сервер выполнила к этому моменту системный вызов listen для socket'а с указанным адресом.

При успешном выполнении запроса системный вызов connect возвращает 0, в противном случае - "-1" (устанавливая код причины неуспеха в глобальной переменной errno).

Примечание. Если к моменту выполнения connect используемый им socket не был привязан к адресу посредством bind,то такая привязка будет выполнена автоматически.

Примечание. В режиме взаимодействия без установления соединения необходимости в выполнении системного вызова connect нет. Однако, его выполнение в таком режиме не является ошибкой - просто меняется смысл выполняемых при этом действий: устанавливается адрес "по умолчанию" для всех последующих посылок дейтаграмм.

Рис.2.4 Схема работы клиента

2.4 Передача данных

После того как канал создан, можно начинать передачу данных. Для передачи данных при помощи протокола гарантированной доставки TCP в данном проекте используются функции send и recv, которые входят в программный интерфейс Windows Sockets.

Функция передачи данных send имеет три параметра - дескриптор сокета sock, на котором выполняется передача, адрес буфера buf, содержащего передаваемое сообщение, размер этого буфера bufsize и флаги flags:

int send (SOCKET sock, const char FAR* buf, int bufsize, int flags);

Параметры функции recv, предназначенной для приема данных, аналогичны параметрам функции send:

int recv (SOCKET sock, char FAR * buf, int bufsize, int flags);

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

В случае ошибки обе эти функции возвращают значение SOCKET_ERROR. Для анализа причин возникновения ошибки следует воспользоваться функцией WSAGetLastError.

После установки канала связи вызывается функция WSAAsyncSelect, в качестве последнего параметра необходимо задать комбинацию констант FD_READ и FD_CLOSE. При этом функция главного окна приложения будет получать сообщение WSA_NETEVENT в тот момент времени, когда чтение данных не вызовет блокировки приложения:

#define WSA_NETEVENT (WM_USER + 2)

rc = WSAAsyncSelect (srv_socket, hWnd, WSA_NETEVENT,

FD_READ | FD_CLOSE);

При необходимости выполнения асинхронной посылки данных вы можете указать функции WSAAsyncSelect еще и параметр FD_WRITE.

Если функция WSAAsyncSelect выполнилась успешно, она возвращает нулевое значение, при ошибке - значение SOCKET_ERROR.

2.5 Управление мышью и клавиатурой

Для управления мышью необходимо обработать ряд сообщений, которые приходят главному окну программе-клиенту, и передать соответственное сообщение программе-серверу. Программа-сервер должна обработать эти сообщения.

Сообщения, которые необходимо обработать:

WM_LBUTTONDOWN

WM_LBUTTONUP

WM_LBUTTONDBLCLK

WM_RBUTTONDOWN

WM_RBUTTONUP

WM_RBUTTONDBLCLK

WM_MOUSEMOVE

Первые шесть сообщений приходят окну, когда происходит нажатие, отпускание и двойное нажатие кнопки мыши (для левой и правой клавиши получается шесть сообщений). Шестое сообщение означает движение мыши.

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

Эмуляция осуществляется функцией mouse_event:

VOID mouse_event(DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, ULONG_PTR dwExtraInfo);

dwFlags определяет какое событие эмулировать, может принимать следующие значения:

MOUSEEVENTF_LEFTDOWN

MOUSEEVENTF_LEFTUP

MOUSEEVENTF_WHEEL

MOUSEEVENTF_XDOWN

MOUSEEVENTF_XUP

MOUSEEVENTF_ABSOLUTE

MOUSEEVENTF_MOVE

MOUSEEVENTF_LEFTDOWN

MOUSEEVENTF_LEFTUP

MOUSEEVENTF_RIGHTDOWN

MOUSEEVENTF_RIGHTUP

MOUSEEVENTF_MIDDLEDOWN

MOUSEEVENTF_MIDDLEUP

MOUSEEVENTF_WHEEL

MOUSEEVENTF_XDOWN

MOUSEEVENTF_XUP

dx смещение по х

dy смещение по у

dwData вращение колеса

С помощью функции mouse_event можно сэмулировать все нужные события.

Управление клавиатурой немногим отличается от управления мышкой.

Нужно обработать только два сообщения:

WM_KEYDOWN

WM_KEYUP

Первое сообщение говори о том, что пользователь нажал клавишу клавиатуры, второе, что отпустил. При приходе этих сообщений параметр главной функции окна wParam принимает значение кода клавиши. Клиент отправляет код клавиши и флаг нажатия (нажали клавишу или отпустили). Сервер получает сообщение и эмулирует соответствующее событие с помощью функции keybd_event.

VOID keybd_event(BYTE bVk,BYTE bScan,DWORD dwFlags,PTR dwExtraInfo);

bVk код клавиши

bScan не используется

dwFlags определяет нажали клавишу или отпустили (если отпустили KEYEVENTF_KEYUP, иначе 0)

2.6 Передача изображения экрана

Отправка изображение экрана происходит по таймеру. Размер изображения экрана с разрешением 800x600 и 32 бита памяти на пиксель около 2 мегабайт, что неприемлемо, т.к. время отправки изображения жестко ограничено условиями поставленной задачи. Но 32 бита на пиксель вовсе не является необходимостью для данного проекта, поэтому в данном проекте осуществляется преобразование полноцветной картинке к картинке в градациях серого (256 цветов серого). Но все равно размер картинки в 700 килобайт не отвечает требованием проекта, поэтому картинка сжимается алгоритмом сжатия LZW, который очень эффективно работает на изображениях. В результате файл получается около 150 кб, что вполне удовлетворительно.

Для получения изображения экрана нужно получить контекст экрана. Его можно получить, используя функцию GetDC, передав ноль в качестве параметра (т.к. дескриптор рабочего стола равен нулю):

HDC DESK_DC=GetDC(0);

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

int SCR_X =GetSystemMetrics(SM_CXSCREEN);

int SCR_Y =GetSystemMetrics(SM_CYSCREEN);

Нужно создать контекст, совместимый с контекстом рабочего стола, для этого используется функция CreateCompatibleDC, в качестве параметра нужно передать контекст экрана:

HDC BMP_DC = CreateCompatibleDC(DESK_DC);

Нужно создать bitmap и связать его с созданным контекстом, для этого используются функции CreateCompatibleBitmap и SelectObject. Первая функция создает bitmap в нее нужно передать контекст экрана и его размеры. Вторая функция связывает bitmap и контекст, в нее передается дескриптор bitmap и созданный контекст.

HBITMAP DRAW_DC = CreateCompatibleBitmap(DESK_DC, SCR_X, SCR_Y);

SelectObject(BMP_DC, DRAW_DC);

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

BOOL BitBlt(

HDC Ошибка! Недопустимый объект гиперссылки., //дескриптор контекста, в который копируем

int Ошибка! Недопустимый объект гиперссылки., // x-координата левого верхнего угла hdcDest

int Ошибка! Недопустимый объект гиперссылки., // y- координата левого верхнего угла hdcDest

int Ошибка! Недопустимый объект гиперссылки., // ширина hdcDest

int Ошибка! Недопустимый объект гиперссылки., // высота hdcDest

HDC Ошибка! Недопустимый объект гиперссылки., // дескриптор контекста источника

int Ошибка! Недопустимый объект гиперссылки., // x- координата левого верхнего угла hdcSrc

int Ошибка! Недопустимый объект гиперссылки., // y- координата левого верхнего угла hdcSrc

DWORD Ошибка! Недопустимый объект гиперссылки. // код операции

);

Функция может выполнять несколько действий, для копирования изображения необходимо послать константу SRCCOPY в качестве параметра dwRop:

BitBlt(BMP_DC,0,0,SCR_X,SCR_Y,DESK_DC,0,0,SRCCOPY);

Теперь нужно извлечь массив цветов пикселей из bitmap, который мы создали, для этого вызывается функция GetBitmapBits:

LONG GetBitmapBits(

HBITMAP Ошибка! Недопустимый объект гиперссылки., // дескриптор bitmap

LONG Ошибка! Недопустимый объект гиперссылки., // количество копируемых байт

LPVOID Ошибка! Недопустимый объект гиперссылки. // буфер, в который копируем

);

Потом цвета пикселей приводятся к цветам градации серого. Лучшим приведением к градации серого считается такая формула:

I=0.299*Ired + 0.587*Igreen + 0.114*Iblue

Где Ired, Igreen, Iblue - интенсивности красного, зеленого и синего цвета соответственно. В результате преобразования получается одна интенсивность, т.е. размер картинки уменьшается в три раза.

После массив подвергается сжатию алгоритмом LZW. Этот алгоритм не имеет прямого отношения к исследуемым вопросам, поэтому будет дано лишь краткое его описание.

Если в двух словах, то LZW-сжатие заменяет строки символов некоторыми кодами. Это делается без какого-либо анализа входного текста. Вместо этого при добавлении каждой новой строки символов просматривается таблица строк. Сжатие происходит, когда код заменяет строку символов. Коды, генерируемые LZW-алгоритмом, могут быть любой длины, но они должны содержать больше бит, чем единичный символ. Первые 256 кодов (когда используются 8-битные символы) по умолчанию соответствуют стандартному набору символов. Остальные коды соответствуют обрабатываемым алгоритмом строкам. Блок схема сжатия для файлов алгоритма LZW приведена на рисунке 2.4 (с точки зрения алгоритма файл почти ничем не отличается от массива).

Рис. 2.4 Блок схема алгоритма сжатия LZW

На рис. 2.4 приведена схема получения отправки изображения экрана.

Рис. 2.4 Схема получения и отправки изображения экрана

Несколько комментариев к вышеприведенной схеме:

1. Все неудачи в выше приведенной схеме, кроме неудачи отправки, очень маловероятны и могут произойти только в случае перегрузки системы или нехватки оперативной памяти.

2. Неудача отправки может случиться в случае ошибки сети.

3. Кроме зашифрованных байт отправляются размеры картинки в пикселях и размер сжатого массива.

Работа программы-клиента по приему изображения ассиметрична работе программы-сервера по отправке (действия выполняются обратные и в обратном порядке).

Основные этапы приема изображения:

1. Прием размеров картинки, размера зашифрованного массива и самого массива.

Нужно принимать пока не будет принят весь массив:

int Nrem=Narj;

BYTE *buf=new BYTE[Narj],*p=buf;

while(Nrem>0)

{

int d=recv(srv_socket,(char*)p,Nrem,0);

if(d>0)

{

Nrem-=d;

p+=d;

}

}

2. Распаковка массива. Происходит по алгоритму LZW (описание можно найти в Интернете)

3. Преобразование интенсивности к цвету в градации серого:

COLORREF color=RGB(I,I,I);

4. Вывод картинки на окно программы-клиента.

Создается контекст устройства и bitmap:

HDC DC=GetDC(hWnd);//получаем контекст окна

HBITMAP HBMP=CreateCompatibleBitmap(DC, SCR_X, SCR_Y);//создаем совместимый

HDC NHDC=CreateCompatibleDC(DC); // контекст и bitmap

Затем необходимо их связать:

SelectObject(NHDC, HBMP);

Скопировать в bitmap полученную картинку и скопировать картинку из созданного контекста в контекст окна.

SetBitmapBits(HBMP,LEN,cadrbuff);//cadrbuff-массив, содержащий цвета пикселей

BitBlt(DC, 0, 0, SCR_X, SCR_Y, NHDC, 0, 0, SRCCOPY);

Полная схема приема изображения приведена на Рис. 2.5.

Рис.2.5 Схема приема изображения

Ошибка при распаковке, фактически, означает неправильную отправку массива, т.к. LZW работает без ошибок.

3. Технологический раздел

3.1 Выбор средств разработки

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

В силу вышеизложенного довода и некоторых других доводов выбор средства разработки проекта велся из следующих сред разработки:

1. Borland C++Builder6

2. Borland Delphi7

3. Microsoft Visual C++.NET

Borland C++ Builder6:

Преимущества:

1. Легкость создания пользовательского интерфейса

2. Гибкий и мощный язык программирования С++

Недостатки:

1. Медленная работа среды

2. Неудобство взаимодействия с асинхронными функциями WinApi (без которых написание данного проекта становится делом весьма сложным)

Borland Delphi7:

Преимущества:

1. Легкость создания пользовательского интерфейса

2. Быстрая работа редактора кода и компилятора

3. Мощный язык программирования Object Pascal

Недостатки:

1. Неудобство взаимодействия с асинхронными функциями WinApi

2. Несколько громоздкий язык программирования

Visual С++.NET:

Преимущества:

1. Это современная среда разработки, отличающаяся удобным редактором кода.

2. Обладает хорошей скоростью редактора текста, компилятора и линковщика.

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

Недостатки:

1. Отсутствие легкости в создание пользовательского интерфейса

Легко заметить, что недостатки Visual C++.NET несущественны, тогда как Borland Delphi7 и Borland C++Builder6 имеют один очень существенный недостаток, а именно плохое взаимодействие с сообщениями ОС Windows. Поэтому для разработки данного проекта была выбрана среда разработки Visual C++.NET.

3.2 Структура программы

Модульная структура программы:

Программа сервер:

1. LZW модуль реализует сжатие и распаковку алгоритмом LZW

2. Send отвечает за отправку данных

3. Receive отвечает за прием данных

4. Server отвечает за инициализацию сокета и за переход в режим ожидания соединения

5. NetСomm реализует интерфейс

Программа клиент:

1. LZW модуль реализует сжатие и распаковку алгоритмом LZW

2. Send отвечает за отправку данных

3. Receive отвечает за прием данных

4. Client реализует интерфейс

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

Основные функции программы-сервера:

функция приема и выполнения команды для клавиатуры:

void recvkey(SOCKET s);

функция приема и выполнения команды для мышки:

void recvmouse(SOCKET s);

функция передачи изображения экрана:

void sendscr(SOCKET s,HWND hWnd);

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

Основные функции программы клиента:

функция передачи команды движения курсора (dx, dy - смещение курсора):

void mousemove(SOCKET srv_socket,short dx,short dy);

функция передачи команды нажатия клавиши клавиатурой (

Vcode - виртуальный код клавиши, fldown - флаг, определяющий была клавиша нажата или отпущена)

void sendkey(SOCKET srv_socket,unsigned Vcode,BOOL fldown);

функция приема изображения экрана (hWnd - дескриптор окна, на которое будет выведено полученное изображение)

void recvscr(SOCKET srv_socket,HWND hWnd)

3.3 Системные требования

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

Требования к компьютерам:

- OS Windows с поддержкой Windows Socket 1.1 и выше

- 64 Mb RAM

- CPU уровня Pentium3 800Mhz, Athlon 800Mhz и выше

- Видео карточка 16Mb видео памяти

- сетевая карточка 100Мегабит/с

- Настроенная сеть поддерживающая 100Мегабит/с

- мышь

3.4 Интерфейс пользователя

Пользовательский интерфейс в обеих программах представлен главным меню и вспомогательными окнами:

Программа-сервер:

Рис 3.1

Start server - устанавливает программу в режим ожидания соединения;

Stop server - программа перестает ожидать соединения или завершает соединение, если находилась в режиме соединения;

Рис 3.2

Рис 3.3

В окне опций можно задать новый код подключения.

Программа-клиент:

Рис 3.4

Main содержит вкладки Properties и Exit.

Properties - окно опций.

В окне опций можно назначить имя сервера.

Рис 3.4

Рис 3.5

Connect - установить соединение с сервером.

Disconnect - разорвать соединение с сервером.

Рис 3.6

Only show - включить/выключить режим наблюдения.

Control - включить режим управления (выключить только F3).

Общие элементы меню (присутствуют в обоих программах):

Рис 3.7

Message - послать сообщение серверу.

File - послать файл серверу.

Режимы клиента:

1. Наблюдение (Рис. 3.8)

Рис 3.8

Управление (Рис. 3.9)

Рис 3.9

3.5 Руководство по установке

Установка программы: данное приложение устанавливается простым копированием на жесткий диск (клиентское приложение на компьютер преподавателя, а серверное на компьютер ученика). Необходимо присутствие на обоих компьютерах настроенной сети и сетевых карточек. Необходимо проследить за правильной настройкой адреса сети и маски сети.

3.6 Руководство администратора

Администратор должен создать список паролей и соответствующих имен компьютеров учеников, на которых будет использоваться данное приложение. Для этого он должен собрать список имен компьютеров у учеников. Затем он должен каким-то образом составить список паролей (возможно, с помощью программы-генератора) и уведомить учеников о присвоенных им паролях. И предоставить преподавателю список паролей и соответствующий ему список имен. Таким образом, имя компьютера как бы играет роль логина.

3.7 Руководство пользователя

3.7.1 Руководство преподавателя

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

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

3.7.2 Руководство ученика

У каждого ученика должен существовать свой личный пароль на получение права подключения к его системе и управления ей. Этот пароль он должен задать в своем приложение. Это позволит обеспечить защиту от несанкционированного доступа к системе. Чтобы к системе мог подключиться преподаватель, ученик должен запустить программу, и перейти в состояния ожидания подключения по сети. После этого преподаватель имеет возможность подключения к системе, контролирования и направления действий своего подопечного. Остальные действия пользователя уже были описаны выше в руководстве преподавателя, они заключаются в основном в выполнение заданий преподавателя.

4. Экспериментальный раздел

4.1 Скорость передачи данных

Схема эксперимента а:

1. Измеряется время передачи файлов ОС Windows и данного приложения

2. Скорость получается делением времени на размер файла

Замечание: время передачи приложения измерялось программно, а время передачи ОС Windows измерялось секундомером, что не очень точно.

Главная характеристика данного проекта эта скорость передачи данных, поэтому интересно провести тесты и сравнить со скоростью передачи данных ОС Windows XP. Тесты проводились на файлах, так как невозможно определить с какой скоростью Windows передает данные из оперативной памяти. Каждое измерение проводилось по пять раз, затем бралось среднее значение.

При измерениях не учитывалось, что время также расходуется на считывание и запись файла. Можно заметить, что при большом размере файла (245.5 Мб) скорость падает, как у приложения, так и у Windows, это, вероятно связано с особенностями работы жесткого диска, а не с замедлением передачи данных через сеть.

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

Схема эксперимента б:

1. Замеряется время, затраченное на передачу файла по сети (без работы с жестким диском) и время, затраченное на передачу файла и на работу с жестким диском

2. Скорость получается делением времени на размер файла

Для того, чтобы понять отношение времени работы с диском и времени передачи данных нужно провести еще ряд измерений. А именно измеряется непосредственно время передачи данных и суммарное время. На основе этих измерений рассчитываются скорости передачи данных. Естественно, передача данных средства ОС Windows уже не будет отражена на диаграмме.

Это означает, что работа с жестким диском сильно замедляет процесс и, скорее всего, разница в скорости работы разработанного приложения и средства Windows (Рис. 4.1) во многом обусловлена именно работой с жестким диском.

4.2 Сжатие изображения

Схема эксперимента:

1. Программно (во время трассировки) узнается размер сжатого файла

2. По разрешению экрана рассчитывается первоначальный размер картинки (ширина * высота)

3. Коэффициент сжатия получается делением первоначального размера картинки на размер сжатой картинки

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

Степень сжатия алгоритма LZW сильно зависит от изображения, поэтому тесты проводились с различными изображениями, и затем результат усреднялся. Кроме разрешения на диаграмме указаны размеры изображения.


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.