Сетевое приложение для получения информации протокола IP и сканирования сети

Архитектура клиент-сервер на основе сокетов Windows. Описание утилиты Ipconfig. Конфигурирование стека TCP/IP. Реализация сокетов через классы NET. Структура библиотечных и пользовательских классов. Схема интерфейса пользователя и работы приложения.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 13.12.2012
Размер файла 419,5 K

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

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

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

СОДЕРЖАНИЕ

  • ВВЕДЕНИЕ
  • 1. ОБЗОР СОСТОЯНИЯ ВОПРОСА
  • 1.1 Архитектура стека TCP/IP
  • 1.2 Описание утилиты Ipconfig
  • 1.3 Конфигурирование стека TCP/IP
  • 1.4 Основы технологии сокетов
  • 1.5 Архитектура клиент-сервер на основе сокетов Windows
  • 1.6 Реализация сокетов через классы NET
  • 1.7 Протокол TCP
  • 2. ПОСТАНОВКА ЗАДАЧИ
  • 3. МОДЕЛИРОВАНИЕ ПО
  • 3.1 Архитектура ПО
  • 3.2 Интерфейс пользователя
  • 3.3 Описание основных функциональных модулей
  • 3.4 Структура классов и объектов
  • 3.4.1 Описание библиотечных классов
  • 3.4.2 Описание пользовательских классов
  • 4. РЕАЛИЗАЦИЯ ПО
  • 5. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
  • ЗАКЛЮЧЕНИЕ
  • ЛИТЕРАТУРА
  • ПРИЛОЖЕНИЕ

ВВЕДЕНИЕ

Сегодня самый распространенный в мире протокол -- стек TCP/IP, который ведет свою историю еще от сети ARPAnet. Название свое он получил от пары протоколов: протокола IP сетевого уровня модели OSI, который обеспечивает доставку данных между узлами, и протокола TCP транспортного уровня, который делает эту доставку надежной. Помимо этих двух протоколов, стек включает в себя множество других.

TCP/IP -- основной протокол Интернета, и этим все сказано: с ним работают десятки миллионов компьютеров во всем мире. На основе TCP/IP работает все больше локальных сетей. Стек TCP/IP за десятки лет своего развития вобрал в себя немало других протоколов: это и протоколы для обеспечения работы гипертекстовых служб WWW -- HTTP, и почтовые протоколы SMTP и POP, и специальные протоколы для шифрования и дешифровки передаваемых данных «на лету», SSL например. Стек TCP/IP поддерживает удобную систему адресации, обладает возможностью фрагментации пакетов, то есть умеет подстраивать их размеры при передаче через сети, построенные на основе разных технологий. Стек TCP/IP поддерживается подавляющим большинством современных операционных систем.

TCP/IP -- центральный протокол для самых распространенных настольных ОС, то есть для разных реализаций разные Windows и Unix [2].

Спецификация сокетов Windows описывает интерфейс Microsoft Windows к сети, котороый основан на концепции "сокетов", ставшей известной благодаря Berkeley Software Distribution (BSD). Они содержат как процедуры, воспроизводящие сокеты Беркли, так и некоторые Windows-специфические расширения, позволяющие программисту использовать "преимущества" ориентированной на сообщения архитектуры Windows [3].

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

1. ОБЗОР СОСТОЯНИЯ ВОПРОСА

1.1 Архитектура стека TCP/IP

Transmission Control Protocol/Internet Protocol (TCP/IP) - это промышленный стандарт стека протоколов, разработанный для глобальных сетей.

Лидирующая роль стека TCP/IP объясняется следующими его свойствами:

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

· Почти все большие сети передают основную часть своего трафика с помощью протокола TCP/IP.

· Это метод получения доступа к сети Internet.

· Этот стек служит основой для создания intranet- корпоративной сети, использующей транспортные услуги Internet и гипертекстовую технологию WWW, разработанную в Internet.

· Все современные операционные системы поддерживают стек TCP/IP.

· Это гибкая технология для соединения разнородных систем как на уровне транспортных подсистем, так и на уровне прикладных сервисов.

· Это устойчивая масштабируемая межплатформенная среда для приложений клиент-сервер.

Так как стек TCP/IP был разработан до появления модели взаимодействия открытых систем ISO/OSI, то, хотя он также имеет многоуровневую структуру, соответствие уровней стека TCP/IP уровням модели OSI достаточно условно. Структура протоколов TCP/IP приведена на рисунке 1.1. Протоколы TCP/IP делятся на 4 уровня.

Рисунок 1.1 - Структура протокола TCP/IP

Самый нижний (уровень IV) соответствует физическому и канальному уровням модели OSI. Этот уровень в протоколах TCP/IP не регламентируется, но поддерживает все популярные стандарты физического и канального уровня.

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

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

Следующий уровень (уровень II) называется основным. На этом уровне функционируют протокол управления передачей TCP (Transmission Control Protocol) и протокол дейтаграмм пользователя UDP (User Datagram Protocol). Протокол TCP обеспечивает надежную передачу сообщений между удаленными прикладными процессами за счет образования виртуальных соединений. Протокол UDP обеспечивает передачу прикладных пакетов дейтаграммным способом, как и IP, и выполняет только функции связующего звена между сетевым протоколом и многочисленными прикладными процессами.

Верхний уровень (уровень I) называется прикладным. За долгие годы использования в сетях различных стран и организаций стек TCP/IP накопил большое количество протоколов и сервисов прикладного уровня. К ним относятся такие широко используемые протоколы, как протокол копирования файлов FTP, протокол эмуляции терминала telnet, почтовый протокол SMTP, используемый в электронной почте сети Internet, гипертекстовые сервисы доступа к удаленной информации, такие как WWW и многие другие [4].

1.2 Описание утилиты Ipconfig

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

Синтаксис

ipconfig [/all] [/renew [адаптер]] [/release [адаптер]] [/flushdns] [/displaydns] [/registerdns] [/showclassid адаптер] [/setclassid адаптер [код_класса]]

Параметры

/all

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

/renew [адаптер]

Обновление конфигурации DHCP для всех адаптеров (если адаптер не задан) или для заданного адаптера. Данный параметр доступен только на компьютерах с адаптерами, настроенными для автоматического получения IP-адресов. Чтобы указать адаптер, введите без параметров имя, выводимое командой ipconfig.

/release [адаптер]

Отправка сообщения DHCPRELEASE серверу DHCP для освобождения текущей конфигурации DHCP и удаление конфигурации IP-адресов для всех адаптеров (если адаптер не задан) или для заданного адаптера. Этот адаптер отключает протокол TCP/IP для адаптеров, настроенных для автоматического получения IP-адресов. Чтобы указать адаптер, введите без параметров имя, выводимое командой ipconfig.

/flushdns

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

/displaydns

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

/registerdns

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

/showclassid адаптер

Отображение кода класса DHCP для указанного адаптера. Чтобы просмотреть код класса DHCP для всех адаптеров, вместо параметра адаптер укажите звездочку (*). Данный параметр доступен только на компьютерах с адаптерами, настроенными для автоматического получения IP-адресов.

/setclassid адаптер [код_класса]

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

/?

Отображение справки в командной строке [5].

1.3 Конфигурирование стека TCP/IP

Для использования стека TCP/IP в среде Windows NT Server необходимо сконфигурировать три параметра :

· IP-адрес (IP-address) - 32-битовый логический адрес, который идентифицирует TCP/IP-хост

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

· маршрутизатор по умолчанию (default gateway) - для взаимодействия с хостом, принадлежащим другой сети, необходимо указать IP-адрес маршрутизатора, с помощью которого можно достичь указанной сети. Если конкретный маршрут к указанной сети не известен, то используется маршрутизатор по умолчанию. Если маршрутизатор по умолчанию не задан, то взаимодействие ограничивается только локальной сетью. Пользователь может добавить статические маршруты с помощью утилиты route, чтобы определить маршрут к конкретной системе. Статические маршруты всегда имеют приоритет перед маршрутами по умолчанию. Для надежности можно определить несколько маршрутизаторов по умолчанию.

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

1.4 Основы технологии сокетов

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

Сокеты определяют конечные точки взаимодействия (обычно через сеть). Они поддерживают целый ряд протоколов, самыми популярными из которых сегодня являются User Datagram Protocol (UDP) и Transmission Control Protocol (TCP).

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

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

TCP-сокеты могут быть либо клиентскими, либо серверными. Серверный сокет ожидает запросы на установление соединений, а клиентский -- инициирует соединение. Как только соединение между сокетами установлено, клиент и сервер могут передавать и принимать данные или закрыть это соединение [7].

1.5 Архитектура клиент-сервер на основе сокетов Windows

Применяемая в IP-сетях архитектура клиент-сервер использует IP-пакеты для коммуникации между клиентом и сервером. Клиент отправляет запрос серверу, на который тот отвечает. В случае с TCP/IP между клиентом и сервером устанавливается соединение (обычно с двусторонней передачей данных), а в случае с UDP/IP - клиент и сервер обмениваются пакетами (дейтаграммамми) с негарантированной доставкой.Каждый сетевой интерфейс IP-сети имеет уникальный в этой сети адрес (IP-адрес). Упрощенно можно считать, что каждый компьютер в сети Интернет имеет собственный IP-адрес. При этом в рамках одного сетевого интерфейса может быть несколько сетевых портов. Для установления сетевого соединения приложение клиента должно выбрать свободный порт и установить соединение с серверным приложением, которое слушает (listen) порт с определенным номером на удаленном сетевом интерфейсе. Пара IP-адрес и порт характеризуют сокет (гнездо) - начальную (конечную) точку сетевой коммуникации. Для создания соединения TCP/IP необходимо два сокета: один на локальной машине, а другой - на удаленной. Таким образом, каждое сетевое соединение имеет IP-адрес и порт на локальной машине, а также IP-адрес и порт на удаленной машине [8].

1.6 Реализация сокетов через классы NET

Большинство классов, которые используются в програмировании сокетов, можно найти в пространстве имен System.Net.Sockets. Программирование сокетов не только позволяет осуществлять связь, ориентированную на соединения, как в случае с HTTP, но также и реализовывать связь без установления соединений, которая используется при групповой рассылке или широковещательной передачи с UDP. Программирование сокетов - чрезвычайно гибкий механизм, позволяющий пользоваться самыми разными протоколами [9].

1.7 Протокол TCP

В NET протокол TCP можно реализовать, используя следующие возможности:

- классы TcpClient и TcpListener;

- класс Socket;

- элемент управления Winsock;

- неуправляемый API Winsock.

Предпочтительнее из перечисленных способов использовать классы .NET. Классы TcpClient и TcpListener построены поверх класса Socket. Все классы .NET для работы с TCP находятся пространстве имён System.Net.Sockets. Это пространство имён предоставляет управляемые классы для TCP, UDP и общего программирования [7].

2. ПОСТАНОВКА ЗАДАЧИ

В рамках данной курсовой работы необходимо разработать клиент-серверное приложение для получения информации протокола IP и сканирования сети. Посылка данных серверу должна быть основана на протоколе TCP с использованием средств .NET.

Приложение должно обеспечивать следующее:

1) клиент-серверная технология на основе сокетов;

2) получение и отправка серверу информации о конфигурации стека TCP/IP;

3) вывод на экран и отправка серверу IP-адресов и имен всех узлов локальной сети.

Требования к реализации проекта:

Операционная система - Windows XP;

Инструментальное средство - Visual Studio;

Платформа разработки -MS .NET Framework;

Графический интерфейс - Windows Forms.

Язык программирования - C#.

3. МОДЕЛИРОВАНИЕ ПО

3.1 Архитектура ПО

Разрабатываемое приложение построено по технологии клиент - сервер на основе сокетов. Сервером является консольное приложение, клиентское приложение имеет графический интерфейс.

Рисунок 3.1 - Упрощенная схема работы приложения

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

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

Номером 1 на схеме обозначено текстовое поле для отображения выводимой информации , номером 2 обозначена кнопка для получения и отправки серверу информации о сетевом адаптере и конфигурации стека TCP/IP, под номером 3 находится кнопка для получения и отправки серверу результатов сканирования сети. Номером 4 обозначена кнопка установления соединения с сервером.

Рисунок 3.2 - Схема интерфейса пользователя

3.3 Описание основных функциональных модулей

Рисунок 3.3 - Структура проекта сервера

Рисунок 3.4 - Структура проекта клиента

3.4 Структура классов и объектов

3.4.1 Описание библиотечных классов

В данном приложении используется следующие классы .NET:

IPGlobalProperties - предоставляет сведения о возможности сетевых подключений на локальном компьютере, использованные методы и свойства:

· GetIPGlobalProperties() - возвращает объект, предоставляющий сведения о возможности подключения локального компьютера по сети и статистику трафика.

IPInterfaceProperties - предоставляет сведения о сетевых интерфейсах, поддерживающих протокол IPv4 или IPv6.

NetworkInterface - предоставляет конфигурацию и статистику сетевого интерфейса, использованные методы и свойства:

· GetAllNetworkInterfaces() - возвращает объекты, описывающие сетевые интерфейсы локального компьютера.

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

· GetHostByName() - по имени хоста получает IP-адрес хоста.

Thread - класс для работы с потоками, использованные методы и свойства:

· Start() - запускает созданный поток;

· IsBackground- свойство содержащее информацию о том, является ли поток фоновым;

· Sleep() -приостанавливает поток.

Socket - класс для работы с сокетами, использованные методы и свойства:

· Bind() - связывает сокет с заданным портом и адресом;

· Listen() - прослушивает заданную конечную точку;

· Accept - принимает соединение.

TcpClient - класс для работы с протоколом TCP, использованные методы и свойства:

· GetStream() - возвращает Stream созданного подключения.

Stream - класс для работы с потоками ввода, использованные методы и свойства:

· Read() - читает данные из потока;

· Write() - записывает данные в поток.

3.4.2 Описание пользовательских классов

При разработке сервера были созданы следующие классы:

Class1 - класс, предназначенный для сканирования сети, и получения списка компьютеров сети. Данный класс импортирует две функции из библиотеки netapi32.dll. Содержит необходимые перечисления для работы с импортируемыми функциями.

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

ConnectionInfo - класс содержащий информацию о подключении.

При разработке клиента были созданы следующие классы:

Form1 - класс содержащий в себе основную логику клиента и обработчики кнопок.

4. РЕАЛИЗАЦИЯ ПО

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

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

Class1, специально разработанный класс для получения списка узлов сети. Метод класса GetServerList основан на функции NetServerEnum. Реализация класса Class1:

public class Class1

{

[DllImport("netapi32.dll", EntryPoint = "NetServerEnum")]

public static extern NERR NetServerEnum([MarshalAs(UnmanagedType.LPWStr)] string ServerName, int Level, out IntPtr BufPtr, int PrefMaxLen, ref int EntriesRead, ref int TotalEntries, SV_101_TYPES ServerType, [MarshalAs(UnmanagedType.LPWStr)] string Domain, int ResumeHandle);

[DllImport("netapi32.dll", EntryPoint = "NetApiBufferFree")]

public static extern NERR NetApiBufferFree(IntPtr Buffer);

//

// типы серверов

//

[Flags]

public enum SV_101_TYPES : uint

{

SV_TYPE_WORKSTATION = 0x00000001,

SV_TYPE_SERVER = 0x00000002,

SV_TYPE_SQLSERVER = 0x00000004,

SV_TYPE_DOMAIN_CTRL = 0x00000008,

SV_TYPE_DOMAIN_BAKCTRL = 0x00000010,

SV_TYPE_TIME_SOURCE = 0x00000020,

SV_TYPE_AFP = 0x00000040,

SV_TYPE_NOVELL = 0x00000080,

SV_TYPE_DOMAIN_MEMBER = 0x00000100,

SV_TYPE_PRINTQ_SERVER = 0x00000200,

SV_TYPE_DIALIN_SERVER = 0x00000400,

SV_TYPE_XENIX_SERVER = 0x00000800,

SV_TYPE_SERVER_UNIX = SV_TYPE_XENIX_SERVER,

SV_TYPE_NT = 0x00001000,

SV_TYPE_WFW = 0x00002000,

SV_TYPE_SERVER_MFPN = 0x00004000,

SV_TYPE_SERVER_NT = 0x00008000,

SV_TYPE_POTENTIAL_BROWSER = 0x00010000,

SV_TYPE_BACKUP_BROWSER = 0x00020000,

SV_TYPE_MASTER_BROWSER = 0x00040000,

SV_TYPE_DOMAIN_MASTER = 0x00080000,

SV_TYPE_SERVER_OSF = 0x00100000,

SV_TYPE_SERVER_VMS = 0x00200000,

SV_TYPE_WINDOWS = 0x00400000,

SV_TYPE_DFS = 0x00800000,

SV_TYPE_CLUSTER_NT = 0x01000000,

SV_TYPE_TERMINALSERVER = 0x02000000,

SV_TYPE_CLUSTER_VS_NT = 0x04000000,

SV_TYPE_DCE = 0x10000000,

SV_TYPE_ALTERNATE_XPORT = 0x20000000,

SV_TYPE_LOCAL_LIST_ONLY = 0x40000000,

SV_TYPE_DOMAIN_ENUM = 0x80000000,

SV_TYPE_ALL = 0xFFFFFFFF,

}

[StructLayout(LayoutKind.Sequential)]

public struct SERVER_INFO_101

{

[MarshalAs(UnmanagedType.U4)]

public uint sv101_platform_id;

[MarshalAs(UnmanagedType.LPWStr)]

public string sv101_name;

[MarshalAs(UnmanagedType.U4)]

public uint sv101_version_major;

[MarshalAs(UnmanagedType.U4)]

public uint sv101_version_minor;

[MarshalAs(UnmanagedType.U4)]

public uint sv101_type;

[MarshalAs(UnmanagedType.LPWStr)]

public string sv101_comment;

}

//

// оперционная система

//

public enum PLATFORM_ID : uint

{

PLATFORM_ID_DOS = 300,

PLATFORM_ID_OS2 = 400,

PLATFORM_ID_NT = 500,

PLATFORM_ID_OSF = 600,

PLATFORM_ID_VMS = 700,

}

//

// список ошибок, возвращаемых NetServerEnum

//

public enum NERR

{

NERR_Success = 0, //Успех

ERROR_ACCESS_DENIED = 5,

ERROR_NOT_ENOUGH_MEMORY = 8,

ERROR_BAD_NETPATH = 53,

ERROR_NETWORK_BUSY = 54,

ERROR_INVALID_PARAMETER = 87,

ERROR_INVALID_LEVEL = 124,

ERROR_MORE_DATA = 234,

ERROR_EXTENDED_ERROR = 1208,

ERROR_NO_NETWORK = 1222,

ERROR_INVALID_HANDLE_STATE = 1609,

ERROR_NO_BROWSER_SERVERS_FOUND = 6118,

}

public ArrayList GetServerList(SV_101_TYPES type)

{

SERVER_INFO_101 si;

IntPtr pInfo = IntPtr.Zero;

int etriesread = 0;

int totalentries = 0;

ArrayList srvs = new ArrayList();

try

{

NERR err = NetServerEnum(null, 101, out pInfo, -1, ref etriesread, ref totalentries, type, null, 0);

if ((err == NERR.NERR_Success || err == NERR.ERROR_MORE_DATA) && pInfo != IntPtr.Zero)

{

int ptr = pInfo.ToInt32();

for (int i = 0; i < etriesread; i++)

{

si = (SERVER_INFO_101)Marshal.PtrToStructure(new IntPtr(ptr), typeof(SERVER_INFO_101));

srvs.Add(si.sv101_name);// добавляем имя

// сервера в список

ptr += Marshal.SizeOf(si);

}

}

}

catch (Exception)

{

}

finally

{ // освобождаем выделенную память

if (pInfo != IntPtr.Zero)

{

NetApiBufferFree(pInfo);

}

}

return (srvs);

}

}

Функция ShowIPAddresses, предназначена для определения и вывода адресов DNS-серверов, основного шлюза, IP. Реализация функции ShowIPAddresses:

public void ShowIPAddresses(IPInterfaceProperties adapterProperties)

{

IPAddressCollection dnsServers = adapterProperties.DnsAddresses;

if (dnsServers != null)

{

foreach (IPAddress dns in dnsServers)

{

txtBoxMessage.AppendText(" DNS Servers:" + dns.ToString() + " \r\n");

}

}

GatewayIPAddressInformationCollection gateway = adapterProperties.GatewayAddresses;

if (gateway != null)

{

foreach (GatewayIPAddressInformation gw in gateway)

{

txtBoxMessage.AppendText(" GateWay:" + gw.Address + "\r\n");

}

}

UnicastIPAddressInformationCollection uniCast = adapterProperties.UnicastAddresses;

if (uniCast != null)

{

foreach (UnicastIPAddressInformation uni in uniCast)

{

txtBoxMessage.AppendText(" IP-Address: " + uni.Address + "\r\n");

}

}

}

Функция ShowNetworkInterfaces, предназначена для получения и вывода информации о сетевых адаптерах, их описании, типе, физическом адресе. Реализация функции ShowNetworkInterfaces:

public void ShowNetworkInterfaces()

{

IPGlobalProperties computerProperties = IPGlobalProperties.GetIPGlobalProperties();

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

txtBoxMessage.AppendText("" + computerProperties.HostName + computerProperties.DomainName + "\r\n");

if (nics == null || nics.Length < 1)

{

txtBoxMessage.AppendText("No network interfaces found.\r\n");

return;

}

foreach (NetworkInterface adapter in nics)

{

IPInterfaceProperties properties = adapter.GetIPProperties();

txtBoxMessage.AppendText(" ");

txtBoxMessage.AppendText(" " + adapter.Description);

txtBoxMessage.AppendText("\r\n Type:" + adapter.NetworkInterfaceType + "\r\n");

txtBoxMessage.AppendText(" Physical Address:" + adapter.GetPhysicalAddress().ToString() + "\r\n");

string versions = "";

if (adapter.Supports(NetworkInterfaceComponent.IPv4))

{

versions = "IPv4";

}

if (adapter.Supports(NetworkInterfaceComponent.IPv6))

{

if (versions.Length > 0)

{

versions += " ";

}

versions += "IPv6";

}

txtBoxMessage.AppendText(" IP version:" + versions + "\r\n");

ShowIPAddresses(properties);

txtBoxMessage.AppendText(" DNS suffix:" + properties.DnsSuffix + "\r\n");

}

}

Класс Form1 содержит обработчики кнопок, а также следующий метод для подключения к серверу:

private void Connection()

{

try

{

hostName = Dns.GetHostName();

tcpClient = new TcpClient(hostName, port);

stream = tcpClient.GetStream();

button1.Enabled = true;

button2.Enabled = true;

}

catch (Exception e)

{

MessageBox.Show(e.Message);

}

}

Приложение сервера.

Разработанный класс ThreadedServer содержит следующие методы:

Start() - метод запускает поток для текущего пользователя, реализация данного метода:

public void Start()

{

SetupServerSocket();

_acceptThread = new Thread(AcceptConnections);

_acceptThread.IsBackground = true;

_acceptThread.Start();

}

SetupServerSocket() - метод для начальной инициализации сервера, реализация данного метода:

privatevoidSetupServerSocket()

{

// Получаем информацию о локальном компьютере

IPHostEntrylocalMachineInfo =

Dns.GetHostEntry(Dns.GetHostName());

IPEndPointmyEndpoint = new IPEndPoint(

localMachineInfo.AddressList[0], _port);

// Создаем сокет, привязываем его к адресу

// и начинаем прослушивание

_serverSocket = newSocket(

myEndpoint.Address.AddressFamily,

SocketType.Stream, ProtocolType.Tcp);

_serverSocket.Bind(myEndpoint);

_serverSocket.Listen((int)

SocketOptionName.MaxConnections);

}

AcceptConnection() - метод для обработки подключения пользователя, реализация данного метода:

private void AcceptConnections()

{

while (true)

{

// Принимаемсоединение

Socket socket = _serverSocket.Accept();

ConnectionInfo connection = new ConnectionInfo();

connection.Socket = socket;

Console.WriteLine("Есть конект.");

// Создаем поток для получения данных

Console.WriteLine("Создаем поток для получения данных.");

connection.Thread = new Thread(ProcessConnection);

connection.Thread.IsBackground = true;

connection.Thread.Start(connection);

// Сохраняемсокет

lock (_connections) _connections.Add(connection);

Console.WriteLine("Колличествопользователейонлайн: " + _connections.Count.ToString());

}

}

ProcessConnection() - метода описывающий процесс выполняемы для каждого пользователя, реализация данного метода

private void ProcessConnection(object state)

{

ConnectionInfo connection = (ConnectionInfo)state;

byte[] buffer = new byte[255];

string message;

Console.WriteLine("Ожиданиесообщения...");

try

{

while (true)

{

buffer = new byte[255];

intbytesRead = connection.Socket.Receive(buffer);

if (bytesRead> 0)

{

Console.Write("Получены данные размером ");

Console.Write(bytesRead.ToString());

Console.WriteLine(" байт(а).");

message = Encoding.Unicode.GetString(buffer, 0, bytesRead);

Console.WriteLine("Содержание: " + message);

foreach (ConnectionInfo conn in _connections)

conn.Socket.Send(buffer, bytesRead, SocketFlags.None);

message = String.Empty;

}

}

}

catch (SocketExceptionexc)

{

if (exc.SocketErrorCode.ToString() == "ConnectionReset")

{

Console.WriteLine("Пользовательотключилсятекущеекол-вопользователей: " + _connections.Count.ToString());

}

else

{

Console.WriteLine("Socket exception: " + exc.SocketErrorCode);

}}

catch (Exception exc)

{

Console.WriteLine("Exception: " + exc);

}

finally

{

connection.Socket.Close();

lock (_connections) _connections.Remove(

connection);

}

}

Класс ConnectionInfo содержит два поля:

Thread - поле содержащее поток пользователя

Socket - поле содержащее сокет пользователя

5. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

Для запуска сервера необходимо запустить файл Serv.exe, на экране появится окно консоли, представленное на рисунке 5.1

Рисунок 5.1 - Окно сервера после запуска

Далее необходимо запустить клиент, для этого нужно запустить исполняемый файл WindowsFormsApplication1.exe, на экране появится окно клиента, представленное на рисунке 5.2

Рисунок 5.2 - Окно клиента после запуска

Для получения и отправки серверу информации о сетевом адаптере и конфигурации стека TCP/IP необходимо нажать кнопку IPСonf, после чего информация отображается в текстовом поле окна клиента и выводится в консоль сервера, результат для клиента представлен на рисунке 5.3, для сервера на рисунке 5.4.

Рисунок 5.3 - Результат нажатия кнопки IPСonf (клиент)

Рисунок 5.4 - Результат нажатия кнопки IPСonf (сервер)

Для запуска сканирования узлов сети следует нажать кнопку Scan, процесс сканирования может занять некоторое время, после чего в текстовом поле отображаются названия компьютеров и их IP-адреса. Результат для окна клиента представлен на рисунке 5.5, для консоли сервера на рисунке 5.6.

Рисунок 5.5 - Результат нажатия кнопки Scan (клиент)

Рисунок 5.6 - Результат нажатия кнопки Scan (сервер)

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

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

ЗАКЛЮЧЕНИЕ

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

В NET протокол TCP можно реализовать, используя следующие возможности:

- классы TcpClient и TcpListener;

- класс Socket;

- элемент управления Winsock;

- неуправляемый API Winsock.

Предпочтительнее из перечисленных способов использовать классы .NET.

Класс Socket обеспечивает простые методы для передачи и приема TCP-датаграмм. Данный механизм рекомендуется использовать в высокопроизводительных серверных приложениях.

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

1) клиент-серверная архитектура на основе сокетов;

2) отправка серверу информации о конфигурации стека TCP/IP клиента;

3) вывод на экран и отправка серверу IP-адресов и имен всех узлов локальной сети;

4) отображение полученной и отсылаемой информации.

ЛИТЕРАТУРА

1. Методические указания к выполнению дипломного проекта для студентов специальностей 1- 40 01 01 «Программное обеспечение информационных технологий» и 1- 40 01 02 «Информационные системы и технологии» / Сост. О.В. Бугай, И.А. Бухвалова, А.Т. Ковальков, Ю.Б. Попова, Н.А. Разоренов- Мн: БНТУ, 2008. - 29 с.

2. СТЕК TCP/IP [Электронный ресурс]. - Режим доступа: http://www.evitel.net/stek-tcpip.html - Дата доступа: 27.05.2012

3. Введение в Microsoft Windows Sockets [Электронный ресурс]. - Режим доступа: http://www.nf-team.org - Дата доступа: 27.05.2012

4. Стек протоколов TCP/IP [Электронный ресурс]. - Режим доступа: http://citforum.ru/nets/ip/glava_2.shtml - Дата доступа: 27.05.2012

5. Ipconfig.exe [Электронный ресурс]. - Режим доступа: http://winchanger.narod.ru/winprograms/ipconfig.htm - Дата доступа: 27.05.2012

6. Работа со стеком TCP/IP в сетях Windows NT [Электронный ресурс]. - Режим доступа: http://citforum.ru/operating_systems/winntadm/winntadm_09.shtml - Дата доступа: 27.05.2012

7. Winsock [Электронный ресурс].- Режим доступа: http://msdn.microsoft.com/ - Дата доступа: 27.05.2012

8. Сетевые приложения на Python [Электронный ресурс].- Режим доступа: http://www.uchi-it.ru/9/11/9.html - Дата доступа: 27.05.2012

9. Кровчик Э. “.NET Сетевое программирование”,М., “Лори”,2005г.,с.192-210.

10. Курсовое проектирование. Общие правила и требования оформления. СТП БНТУ 3.01-2003.Минск,2003г.

ПРИЛОЖЕНИЕ

Листинг модуля сервера

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Net.Sockets;

using System.Threading;

using System.Net;

namespace ServerLab7

{

class Program

{

static void Main(string[] args)

{

int port = 10000;

ThreadedServer ts = new ThreadedServer(port);

ts.Start();

Console.WriteLine("Ожидание соединения...");

Console.ReadLine();

}

}

class ThreadedServer

{

private Socket _serverSocket;

private int _port;

public ThreadedServer(int port) { _port = port; }

private class ConnectionInfo

{

public Socket Socket;

public Thread Thread;

}

private Thread _acceptThread;

private List<ConnectionInfo> _connections =

new List<ConnectionInfo>();

public void Start()

{

SetupServerSocket();

_acceptThread = new Thread(AcceptConnections);

_acceptThread.IsBackground = true;

_acceptThread.Start();

}

private void SetupServerSocket()

{

// Получаем информацию о локальном компьютере

IPHostEntry localMachineInfo =

Dns.GetHostEntry(Dns.GetHostName());

IPEndPoint myEndpoint = new IPEndPoint(

localMachineInfo.AddressList[0], _port);

// Создаем сокет, привязываем его к адресу

// и начинаем прослушивание

_serverSocket = new Socket(

myEndpoint.Address.AddressFamily,

SocketType.Stream, ProtocolType.Tcp);

_serverSocket.Bind(myEndpoint);

_serverSocket.Listen((int)

SocketOptionName.MaxConnections);

}

private void AcceptConnections()

{

while (true)

{

// Принимаем соединение

Socket socket = _serverSocket.Accept();

ConnectionInfo connection = new ConnectionInfo();

connection.Socket = socket;

Console.WriteLine("Соединение установлено.");

// Создаем поток для получения данных

Console.WriteLine("Создание потока для получения данных.");

connection.Thread = new Thread(ProcessConnection);

connection.Thread.IsBackground = true;

connection.Thread.Start(connection);

// Сохраняем сокет

lock (_connections) _connections.Add(connection);

}

}

private void ProcessConnection(object state)

{

ConnectionInfo connection = (ConnectionInfo)state;

byte[] buffer = new byte[1000];

string message;

Console.WriteLine("Ожидание данных...");

try

{

while (true)

{

buffer = new byte[1000];

int bytesRead = connection.Socket.Receive(buffer);

if (bytesRead > 0)

{

message = Encoding.Unicode.GetString(buffer, 0, bytesRead);

Console.WriteLine("Получены данные:\r\n " + message);

foreach (ConnectionInfo conn in _connections)

conn.Socket.Send(buffer, bytesRead, SocketFlags.None);

message = String.Empty;

}

}

}

catch (SocketException exc)

{

if (exc.SocketErrorCode.ToString() == "ConnectionReset")

{

Console.WriteLine("Пользователь отключился текущее кол-во пользователей: " + _connections.Count.ToString());

}

else

{

Console.WriteLine("Socket exception: " + exc.SocketErrorCode);

}

}

catch (Exception exc)

{

Console.WriteLine("Exception: " + exc);

}

finally

{

connection.Socket.Close();

lock (_connections) _connections.Remove(

connection);

}

}

}

}

Листинг модуля клиента

using System;

using System.Windows;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Net.Sockets;

using System.IO;

using System.Net;

using System.Threading;

using System.Net.NetworkInformation;

using System.Runtime.InteropServices;

using System.Collections;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

string hostName; // DNS-имя сервера

int port = 10000; // Номер порта

Stream stream;

TcpClient tcpClient;

public class Class1

{

[DllImport("netapi32.dll", EntryPoint = "NetServerEnum")]

public static extern NERR NetServerEnum([MarshalAs(UnmanagedType.LPWStr)] string ServerName, int Level, out IntPtr BufPtr, int PrefMaxLen, ref int EntriesRead, ref int TotalEntries, SV_101_TYPES ServerType, [MarshalAs(UnmanagedType.LPWStr)] string Domain, int ResumeHandle);

[DllImport("netapi32.dll", EntryPoint = "NetApiBufferFree")]

public static extern NERR NetApiBufferFree(IntPtr Buffer);

[Flags]

public enum SV_101_TYPES : uint

{

SV_TYPE_WORKSTATION = 0x00000001,

SV_TYPE_SERVER = 0x00000002,

SV_TYPE_SQLSERVER = 0x00000004,

SV_TYPE_DOMAIN_CTRL = 0x00000008,

SV_TYPE_DOMAIN_BAKCTRL = 0x00000010,

SV_TYPE_TIME_SOURCE = 0x00000020,

SV_TYPE_AFP = 0x00000040,

SV_TYPE_NOVELL = 0x00000080,

SV_TYPE_DOMAIN_MEMBER = 0x00000100,

SV_TYPE_PRINTQ_SERVER = 0x00000200,

SV_TYPE_DIALIN_SERVER = 0x00000400,

SV_TYPE_XENIX_SERVER = 0x00000800,

SV_TYPE_SERVER_UNIX = SV_TYPE_XENIX_SERVER,

SV_TYPE_NT = 0x00001000,

SV_TYPE_WFW = 0x00002000,

SV_TYPE_SERVER_MFPN = 0x00004000,

SV_TYPE_SERVER_NT = 0x00008000,

SV_TYPE_POTENTIAL_BROWSER = 0x00010000,

SV_TYPE_BACKUP_BROWSER = 0x00020000,

SV_TYPE_MASTER_BROWSER = 0x00040000,

SV_TYPE_DOMAIN_MASTER = 0x00080000,

SV_TYPE_SERVER_OSF = 0x00100000,

SV_TYPE_SERVER_VMS = 0x00200000,

SV_TYPE_WINDOWS = 0x00400000,

SV_TYPE_DFS = 0x00800000,

SV_TYPE_CLUSTER_NT = 0x01000000,

SV_TYPE_TERMINALSERVER = 0x02000000,

SV_TYPE_CLUSTER_VS_NT = 0x04000000,

SV_TYPE_DCE = 0x10000000,

SV_TYPE_ALTERNATE_XPORT = 0x20000000,

SV_TYPE_LOCAL_LIST_ONLY = 0x40000000,

SV_TYPE_DOMAIN_ENUM = 0x80000000,

SV_TYPE_ALL = 0xFFFFFFFF,

}

[StructLayout(LayoutKind.Sequential)]

public struct SERVER_INFO_101

{

[MarshalAs(UnmanagedType.U4)]

public uint sv101_platform_id;

[MarshalAs(UnmanagedType.LPWStr)]

public string sv101_name;

[MarshalAs(UnmanagedType.U4)]

public uint sv101_version_major;

[MarshalAs(UnmanagedType.U4)]

public uint sv101_version_minor;

[MarshalAs(UnmanagedType.U4)]

public uint sv101_type;

[MarshalAs(UnmanagedType.LPWStr)]

public string sv101_comment;

}

public enum PLATFORM_ID : uint

{

PLATFORM_ID_DOS = 300,

PLATFORM_ID_OS2 = 400,

PLATFORM_ID_NT = 500,

PLATFORM_ID_OSF = 600,

PLATFORM_ID_VMS = 700,

}

public enum NERR

{

NERR_Success = 0,

ERROR_ACCESS_DENIED = 5,

ERROR_NOT_ENOUGH_MEMORY = 8,

ERROR_BAD_NETPATH = 53,

ERROR_NETWORK_BUSY = 54,

ERROR_INVALID_PARAMETER = 87,

ERROR_INVALID_LEVEL = 124,

ERROR_MORE_DATA = 234,

ERROR_EXTENDED_ERROR = 1208,

ERROR_NO_NETWORK = 1222,

ERROR_INVALID_HANDLE_STATE = 1609,

ERROR_NO_BROWSER_SERVERS_FOUND = 6118,

}

public ArrayList GetServerList(SV_101_TYPES type)

{

SERVER_INFO_101 si;

IntPtr pInfo = IntPtr.Zero;

int etriesread = 0;

int totalentries = 0;

ArrayList srvs = new ArrayList();

try

{

NERR err = NetServerEnum(null, 101, out pInfo, -1, ref etriesread, ref totalentries, type, null, 0);

if ((err == NERR.NERR_Success || err == NERR.ERROR_MORE_DATA) && pInfo != IntPtr.Zero)

{

int ptr = pInfo.ToInt32();

for (int i = 0; i < etriesread; i++)

{

si = (SERVER_INFO_101)Marshal.PtrToStructure(new IntPtr(ptr), typeof(SERVER_INFO_101));

srvs.Add(si.sv101_name);

ptr += Marshal.SizeOf(si);

}

}

}

catch (Exception)

{

}

finally

{

if (pInfo != IntPtr.Zero)

{

NetApiBufferFree(pInfo);

}

}

return (srvs);

}

}

public void ShowIPAddresses(IPInterfaceProperties adapterProperties)

{

IPAddressCollection dnsServers = adapterProperties.DnsAddresses;

if (dnsServers != null)

{

foreach (IPAddress dns in dnsServers)

{

txtBoxMessage.AppendText(" DNS Servers:" + dns.ToString() + " \r\n");

}

}

GatewayIPAddressInformationCollection gateway = adapterProperties.GatewayAddresses;

if (gateway != null)

{

foreach (GatewayIPAddressInformation gw in gateway)

{

txtBoxMessage.AppendText(" GateWay:" + gw.Address + "\r\n");

}

}

UnicastIPAddressInformationCollection uniCast = adapterProperties.UnicastAddresses;

if (uniCast != null)

{

foreach (UnicastIPAddressInformation uni in uniCast)

{

txtBoxMessage.AppendText(" IP-Address: " + uni.Address + "\r\n");

}

}

}

public void ShowNetworkInterfaces()

{

IPGlobalProperties computerProperties = IPGlobalProperties.GetIPGlobalProperties();

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

txtBoxMessage.AppendText("" + computerProperties.HostName + computerProperties.DomainName + "\r\n");

if (nics == null || nics.Length < 1)

{

txtBoxMessage.AppendText("No network interfaces found.\r\n");

return;

}

foreach (NetworkInterface adapter in nics)

{

IPInterfaceProperties properties = adapter.GetIPProperties();

txtBoxMessage.AppendText(" ");

txtBoxMessage.AppendText(" " + adapter.Description);

txtBoxMessage.AppendText("\r\n Type:" + adapter.NetworkInterfaceType + "\r\n");

txtBoxMessage.AppendText(" Physical Address:" + adapter.GetPhysicalAddress().ToString() + "\r\n");

string versions = "";

if (adapter.Supports(NetworkInterfaceComponent.IPv4))

{

versions = "IPv4";

}

if (adapter.Supports(NetworkInterfaceComponent.IPv6))

{

if (versions.Length > 0)

{

versions += " ";

}

versions += "IPv6";

}

txtBoxMessage.AppendText(" IP version:" + versions + "\r\n");

ShowIPAddresses(properties);

txtBoxMessage.AppendText(" DNS suffix:" + properties.DnsSuffix + "\r\n");

}

}

public Form1()

{

InitializeComponent();

Connection();

}

private void button1_Click(object sender, EventArgs e)

{

txtBoxMessage.Clear();

ShowNetworkInterfaces();

string sendMessage = txtBoxMessage.Text;

byte[] data = Encoding.Unicode.GetBytes(sendMessage);

stream.Write(data, 0, data.Length);

sendMessage = string.Empty;

}

private void Connection()

{

try

{

hostName = Dns.GetHostName();

tcpClient = new TcpClient(hostName, port);

stream = tcpClient.GetStream();

button1.Enabled = true;

button2.Enabled = true;

}

catch (Exception e)

{

MessageBox.Show(e.Message);

}

}

private void button3_Click(object sender, EventArgs e)

{

Connection();

}

private void button2_Click(object sender, EventArgs e)

{

txtBoxMessage.Clear();

txtBoxMessage.AppendText("WORKSTATION:\r\n");

Class1 cl = new Class1();

ArrayList list = cl.GetServerList(Class1.SV_101_TYPES.SV_TYPE_WORKSTATION);

foreach (string name in list)

{

txtBoxMessage.AppendText(" " + name + "\r\n");

IPHostEntry iphostentry = Dns.GetHostByName(name);

int nIP = 0;

foreach (IPAddress ipaddress in iphostentry.AddressList)

{

txtBoxMessage.AppendText("IP #" + ++nIP + ": " + ipaddress.ToString() + "\r\n");

}

}

string sendMessage = txtBoxMessage.Text;

byte[] data = Encoding.Unicode.GetBytes(sendMessage);

stream.Write(data, 0, data.Length);

sendMessage = string.Empty;

}

}

}

Размещено на Allbest.ru


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

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

    курсовая работа [222,0 K], добавлен 24.04.2015

  • Многоуровневые архитектуры клиент–сервер. Диаграммы классов, реализующих уровни презентации, бизнес–логики и базы данных приложения. Словесное описание процесса выполнения транзакций. Создание, изменение и удаление хранимых процедур, их выполнение.

    курсовая работа [3,4 M], добавлен 23.03.2013

  • Сетевое программное обеспечение: общее понятие, содержание, функции. Этапы развития теории компьютерных сетей. Проектирование в среде программирования Borland Builder C++ клиент серверного приложения с использованием сокетов, листинг данной программы.

    курсовая работа [191,5 K], добавлен 07.01.2015

  • Информация по протоколам IP/TCP/UDP. Интерфейс сокетов, его создание и уничтожение. API пользовательского уровня. Обмен данными без установки соединения (UDP), с его установкой (TDP). Утилиты пользовательского уровня. Архитектура сетевой подсистемы Linux.

    лекция [480,5 K], добавлен 29.07.2012

  • Разработка клиент-серверного приложения на основе TCP\IP соединения. Организация работы удаленного генератора псевдослучайных последовательностей. Описание основных функциональных модулей. Интерфейс пользователя, сетевое взаимодействие и алгоритм.

    курсовая работа [223,6 K], добавлен 18.10.2013

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

    курсовая работа [1,5 M], добавлен 26.02.2015

  • Внедрение программного продукта в организации. Описание входной и выходной информации. Конфигурирование приложения "Сервис веб-помощи". Обзор пользовательского интерфейса. Руководство пользователя для персонала больницы и для администратора приложения.

    дипломная работа [2,9 M], добавлен 24.06.2013

  • Эволюция графических пользовательских интерфейсов. Устройство системы X Window и менеджеры окон. Описание рабочего стола и приложения KDE и GNOME. Обзор основных принципов организации интерфейса в системе Windows, описание пакета ее прикладных программ.

    реферат [1,8 M], добавлен 15.02.2012

  • Разработка приложений для смартфонов на ОС Android для сети аптек "Фармация". Архитектура операционной системы Android. Архитектура и реализация приложения. Его функциональность. Описание работы мобильного приложения. Расчет затрат на создание продукта.

    дипломная работа [1,6 M], добавлен 17.06.2017

  • Реализация проекта по оптимизации отделений почтовой связи. Направления деятельности в области кадровой политики. Автоматизация обработки получаемой техническим отделом информации. Разработка приложения клиент-сервер. Описание клиентского приложения.

    курсовая работа [34,3 K], добавлен 07.08.2013

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