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

 

СОДЕРЖАНИЕ


ВВЕДЕНИЕ

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

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

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

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

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

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

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

.7 Протокол TCP

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

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

.1 Архитектура ПО

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

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

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

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

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

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

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

ЗАКЛЮЧЕНИЕ

ЛИТЕРАТУРА

ПРИЛОЖЕНИЕ



ВВЕДЕНИЕ


Сегодня самый распространенный в мире протокол - стек TCP/IP, который ведет свою историю еще от сети ARPAnet. Название свое он получил от пары протоколов: протокола IP сетевого уровня модели OSI, который обеспечивает доставку данных между узлами, и протокола 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-адрес, маска подсети и основной шлюз для каждого сетевого адаптера.

Синтаксис[/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).сокеты не требуют установления логических соединений и обычно применяются для широковещательной и многоадресной (multicast) связи. В UDP нет средств надежной доставки сообщений и контроля правильного порядка пакетов, поэтому за обнаружение потери пакетов, устранение таких проблем и упорядочение пакетов отвечает приложение-получатель.сокеты ориентированы на логические соединения, предоставляя надежный коммуникационный путь двумя конечными точками. Важное преимущество 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.

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

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

) получение и отправка серверу информации о конфигурации стека 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Структура классов и объектов


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

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

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

·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. РЕАЛИЗАЦИЯ ПО

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

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

public class Class1

{

[DllImport("netapi32.dll", EntryPoint = "NetServerEnum")]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")]static extern NERR NetApiBufferFree(IntPtr Buffer);

//

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

//

[Flags]enum SV_101_TYPES : uint

{_TYPE_WORKSTATION = 0x00000001,_TYPE_SERVER = 0x00000002,_TYPE_SQLSERVER = 0x00000004,_TYPE_DOMAIN_CTRL = 0x00000008,_TYPE_DOMAIN_BAKCTRL = 0x00000010,_TYPE_TIME_SOURCE = 0x00000020,_TYPE_AFP = 0x00000040,_TYPE_NOVELL = 0x00000080,_TYPE_DOMAIN_MEMBER = 0x00000100,_TYPE_PRINTQ_SERVER = 0x00000200,_TYPE_DIALIN_SERVER = 0x00000400,_TYPE_XENIX_SERVER = 0x00000800,_TYPE_SERVER_UNIX = SV_TYPE_XENIX_SERVER,_TYPE_NT = 0x00001000,_TYPE_WFW = 0x00002000,_TYPE_SERVER_MFPN = 0x00004000,_TYPE_SERVER_NT = 0x00008000,_TYPE_POTENTIAL_BROWSER = 0x00010000,_TYPE_BACKUP_BROWSER = 0x00020000,_TYPE_MASTER_BROWSER = 0x00040000,_TYPE_DOMAIN_MASTER = 0x00080000,_TYPE_SERVER_OSF = 0x00100000,_TYPE_SERVER_VMS = 0x00200000,_TYPE_WINDOWS = 0x00400000,_TYPE_DFS = 0x00800000,_TYPE_CLUSTER_NT = 0x01000000,_TYPE_TERMINALSERVER = 0x02000000,_TYPE_CLUSTER_VS_NT = 0x04000000,_TYPE_DCE = 0x10000000,_TYPE_ALTERNATE_XPORT = 0x20000000,_TYPE_LOCAL_LIST_ONLY = 0x40000000,_TYPE_DOMAIN_ENUM = 0x80000000,_TYPE_ALL = 0xFFFFFFFF,

}

[StructLayout(LayoutKind.Sequential)]struct SERVER_INFO_101

{

[MarshalAs(UnmanagedType.U4)]uint sv101_platform_id;

[MarshalAs(UnmanagedType.LPWStr)]string sv101_name;

[MarshalAs(UnmanagedType.U4)]uint sv101_version_major;

[MarshalAs(UnmanagedType.U4)]uint sv101_version_minor;

[MarshalAs(UnmanagedType.U4)]uint sv101_type;

[MarshalAs(UnmanagedType.LPWStr)]string sv101_comment;

}

//

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

//enum PLATFORM_ID : uint

{_ID_DOS = 300,_ID_OS2 = 400,_ID_NT = 500,_ID_OSF = 600,_ID_VMS = 700,

}

//

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

//enum NERR

{_Success = 0, //Успех_ACCESS_DENIED = 5,_NOT_ENOUGH_MEMORY = 8,_BAD_NETPATH = 53,_NETWORK_BUSY = 54,_INVALID_PARAMETER = 87,_INVALID_LEVEL = 124,_MORE_DATA = 234,_EXTENDED_ERROR = 1208,_NO_NETWORK = 1222,_INVALID_HANDLE_STATE = 1609,_NO_BROWSER_SERVERS_FOUND = 6118,

}ArrayList GetServerList(SV_101_TYPES type)

{_INFO_101 si;pInfo = IntPtr.Zero;etriesread = 0;totalentries = 0;srvs = new ArrayList();

{err = NetServerEnum(null, 101, out pInfo, -1, ref etriesread, ref totalentries, type, null, 0);((err == NERR.NERR_Success || err == NERR.ERROR_MORE_DATA) && pInfo != IntPtr.Zero)

{ptr = pInfo.ToInt32();(int i = 0; i < etriesread; i++)

{= (SERVER_INFO_101)Marshal.PtrToStructure(new IntPtr(ptr), typeof(SERVER_INFO_101));.Add(si.sv101_name);// добавляем имя

// сервера в список+= Marshal.SizeOf(si);

}

}

}(Exception)

{

}

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

if (pInfo != IntPtr.Zero)

{(pInfo);

}

}(srvs);

}

}

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

{dnsServers = adapterProperties.DnsAddresses;(dnsServers != null)

{(IPAddress dns in dnsServers)

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

}

}gateway = adapterProperties.GatewayAddresses;(gateway != null)

{(GatewayIPAddressInformation gw in gateway)

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

}

}uniCast = adapterProperties.UnicastAddresses;(uniCast != null)

{(UnicastIPAddressInformation uni in uniCast)

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

}

}

}

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

{computerProperties = IPGlobalProperties.GetIPGlobalProperties();[] nics = NetworkInterface.GetAllNetworkInterfaces();.AppendText("" + computerProperties.HostName + computerProperties.DomainName + "\r\n");(nics == null || nics.Length < 1)

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

}(NetworkInterface adapter in nics)

{properties = adapter.GetIPProperties();.AppendText(" ");.AppendText(" " + adapter.Description);.AppendText("\r\n Type:" + adapter.NetworkInterfaceType + "\r\n");.AppendText(" Physical Address:" + adapter.GetPhysicalAddress().ToString() + "\r\n");versions = "";(adapter.Supports(NetworkInterfaceComponent.IPv4))

{= "IPv4";

}(adapter.Supports(NetworkInterfaceComponent.IPv6))

{(versions.Length > 0)

{+= " ";

}+= "IPv6";

}.AppendText(" IP version:" + versions + "\r\n");(properties);.AppendText(" DNS suffix:" + properties.DnsSuffix + "\r\n");

}

}

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

private void Connection()

{

{= Dns.GetHostName();= new TcpClient(hostName, port);= tcpClient.GetStream();.Enabled = true;.Enabled = true;

}(Exception e)

{.Show(e.Message);

}

}

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

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

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

public void Start()

{();

_acceptThread = new Thread(AcceptConnections);

_acceptThread.IsBackground = true;

_acceptThread.Start();

}

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

{

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

IPHostEntrylocalMachineInfo =.GetHostEntry(Dns.GetHostName());= new IPEndPoint(.AddressList[0], _port);

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

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

_serverSocket = newSocket(

myEndpoint.Address.AddressFamily,.Stream, ProtocolType.Tcp);

_serverSocket.Bind(myEndpoint);

_serverSocket.Listen((int)

SocketOptionName.MaxConnections);

}

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

private void AcceptConnections()

{(true)

{

// Принимаемсоединениеsocket = _serverSocket.Accept();connection = new ConnectionInfo();.Socket = socket;.WriteLine("Есть конект.");

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

connection.Thread = new Thread(ProcessConnection);.Thread.IsBackground = true;.Thread.Start(connection);

// Сохраняемсокет(_connections) _connections.Add(connection);.WriteLine("Колличествопользователейонлайн: " + _connections.Count.ToString());

}

}

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

private void ProcessConnection(object state)

{connection = (ConnectionInfo)state;[] buffer = new byte[255];message;.WriteLine("Ожиданиесообщения...");

{(true)

{= new byte[255];= connection.Socket.Receive(buffer);

if (bytesRead> 0)

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

Console.Write(bytesRead.ToString());.WriteLine(" байт(а).");= Encoding.Unicode.GetString(buffer, 0, bytesRead);.WriteLine("Содержание: " + message);(ConnectionInfo conn in _connections).Socket.Send(buffer, bytesRead, SocketFlags.None);= String.Empty;

}

}

}(SocketExceptionexc)

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

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

}

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

}}(Exception exc)

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

}

{.Socket.Close();(_connections) _connections.Remove();

}

}

Класс ConnectionInfo содержит два поля: - поле содержащее поток пользователя

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-датаграмм. Данный механизм рекомендуется использовать в высокопроизводительных серверных приложениях.

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

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

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

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

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



ЛИТЕРАТУРА


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

2.СТЕК TCP/IP [Электронный ресурс]. - Режим доступа: <#"justify">ПРИЛОЖЕНИЕ


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

using System.Collections.Generic;System.Linq;System.Text;System.Net.Sockets;System.Threading;System.Net;ServerLab7

{Program

{void Main(string[] args)

{port = 10000;ts = new ThreadedServer(port);.Start();.WriteLine("Ожидание соединения...");.ReadLine();

}

}ThreadedServer

{Socket _serverSocket;int _port;ThreadedServer(int port) { _port = port; }class ConnectionInfo

{Socket Socket;Thread Thread;

}Thread _acceptThread;List<ConnectionInfo> _connections =List<ConnectionInfo>();void Start()

{();

_acceptThread = new Thread(AcceptConnections);

_acceptThread.IsBackground = true;

_acceptThread.Start();

}void SetupServerSocket()

{

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

IPHostEntry localMachineInfo =.GetHostEntry(Dns.GetHostName());myEndpoint = new IPEndPoint(.AddressList[0], _port);

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

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

_serverSocket = new Socket(

myEndpoint.Address.AddressFamily,.Stream, ProtocolType.Tcp);

_serverSocket.Bind(myEndpoint);

_serverSocket.Listen((int).MaxConnections);

}void AcceptConnections()

{(true)

{

// Принимаем соединениеsocket = _serverSocket.Accept();connection = new ConnectionInfo();.Socket = socket;

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

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

connection.Thread = new Thread(ProcessConnection);.Thread.IsBackground = true;.Thread.Start(connection);

// Сохраняем сокет(_connections) _connections.Add(connection);

}

}void ProcessConnection(object state)

{connection = (ConnectionInfo)state;[] buffer = new byte[1000];message;.WriteLine("Ожидание данных...");

{(true)

{= new byte[1000];bytesRead = connection.Socket.Receive(buffer);(bytesRead > 0)

{= Encoding.Unicode.GetString(buffer, 0, bytesRead);.WriteLine("Получены данные:\r\n " + message);(ConnectionInfo conn in _connections).Socket.Send(buffer, bytesRead, SocketFlags.None);= String.Empty;

}

}

}(SocketException exc)

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

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

}

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

}

}(Exception exc)

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

}

{.Socket.Close();(_connections) _connections.Remove();

}

}

}

}

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

using System;

using System.Windows;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;System.Net.Sockets;System.IO;System.Net;System.Threading;System.Net.NetworkInformation;System.Runtime.InteropServices;System.Collections;WindowsFormsApplication1

{partial class Form1 : Form

{hostName; // DNS-имя сервераport = 10000; // Номер портаstream;tcpClient;class Class1

{

[DllImport("netapi32.dll", EntryPoint = "NetServerEnum")]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")]static extern NERR NetApiBufferFree(IntPtr Buffer);

[Flags]enum SV_101_TYPES : uint

{_TYPE_WORKSTATION = 0x00000001,_TYPE_SERVER = 0x00000002,_TYPE_SQLSERVER = 0x00000004,_TYPE_DOMAIN_CTRL = 0x00000008,_TYPE_DOMAIN_BAKCTRL = 0x00000010,_TYPE_TIME_SOURCE = 0x00000020,_TYPE_AFP = 0x00000040,_TYPE_NOVELL = 0x00000080,_TYPE_DOMAIN_MEMBER = 0x00000100,_TYPE_PRINTQ_SERVER = 0x00000200,_TYPE_DIALIN_SERVER = 0x00000400,_TYPE_XENIX_SERVER = 0x00000800,_TYPE_SERVER_UNIX = SV_TYPE_XENIX_SERVER,_TYPE_NT = 0x00001000,_TYPE_WFW = 0x00002000,_TYPE_SERVER_MFPN = 0x00004000,_TYPE_SERVER_NT = 0x00008000,_TYPE_POTENTIAL_BROWSER = 0x00010000,_TYPE_BACKUP_BROWSER = 0x00020000,_TYPE_MASTER_BROWSER = 0x00040000,_TYPE_DOMAIN_MASTER = 0x00080000,_TYPE_SERVER_OSF = 0x00100000,_TYPE_SERVER_VMS = 0x00200000,_TYPE_WINDOWS = 0x00400000,_TYPE_DFS = 0x00800000,_TYPE_CLUSTER_NT = 0x01000000,_TYPE_TERMINALSERVER = 0x02000000,_TYPE_CLUSTER_VS_NT = 0x04000000,_TYPE_DCE = 0x10000000,_TYPE_ALTERNATE_XPORT = 0x20000000,_TYPE_LOCAL_LIST_ONLY = 0x40000000,_TYPE_DOMAIN_ENUM = 0x80000000,_TYPE_ALL = 0xFFFFFFFF,

}

[StructLayout(LayoutKind.Sequential)]struct SERVER_INFO_101

{

[MarshalAs(UnmanagedType.U4)]uint sv101_platform_id;

[MarshalAs(UnmanagedType.LPWStr)]string sv101_name;

[MarshalAs(UnmanagedType.U4)]uint sv101_version_major;

[MarshalAs(UnmanagedType.U4)]uint sv101_version_minor;

[MarshalAs(UnmanagedType.U4)]uint sv101_type;

[MarshalAs(UnmanagedType.LPWStr)]string sv101_comment;

}enum PLATFORM_ID : uint

{_ID_DOS = 300,_ID_OS2 = 400,_ID_NT = 500,_ID_OSF = 600,_ID_VMS = 700,

}enum NERR

{_Success = 0,_ACCESS_DENIED = 5,_NOT_ENOUGH_MEMORY = 8,_BAD_NETPATH = 53,_NETWORK_BUSY = 54,_INVALID_PARAMETER = 87,_INVALID_LEVEL = 124,_MORE_DATA = 234,_EXTENDED_ERROR = 1208,_NO_NETWORK = 1222,_INVALID_HANDLE_STATE = 1609,_NO_BROWSER_SERVERS_FOUND = 6118,

}ArrayList GetServerList(SV_101_TYPES type)

{_INFO_101 si;pInfo = IntPtr.Zero;etriesread = 0;totalentries = 0;srvs = new ArrayList();

{err = NetServerEnum(null, 101, out pInfo, -1, ref etriesread, ref totalentries, type, null, 0);((err == NERR.NERR_Success || err == NERR.ERROR_MORE_DATA) && pInfo != IntPtr.Zero)

{ptr = pInfo.ToInt32();(int i = 0; i < etriesread; i++)

{= (SERVER_INFO_101)Marshal.PtrToStructure(new IntPtr(ptr), typeof(SERVER_INFO_101));.Add(si.sv101_name);+= Marshal.SizeOf(si);

}

}

}(Exception)

{

}

{(pInfo != IntPtr.Zero)

{(pInfo);

}

}(srvs);

}

}void ShowIPAddresses(IPInterfaceProperties adapterProperties)

{dnsServers = adapterProperties.DnsAddresses;(dnsServers != null)

{(IPAddress dns in dnsServers)

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

}

}gateway = adapterProperties.GatewayAddresses;(gateway != null)

{(GatewayIPAddressInformation gw in gateway)

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

}

}uniCast = adapterProperties.UnicastAddresses;(uniCast != null)

{(UnicastIPAddressInformation uni in uniCast)

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

}

}

}void ShowNetworkInterfaces()

{computerProperties = IPGlobalProperties.GetIPGlobalProperties();[] nics = NetworkInterface.GetAllNetworkInterfaces();.AppendText("" + computerProperties.HostName + computerProperties.DomainName + "\r\n");(nics == null || nics.Length < 1)

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

}(NetworkInterface adapter in nics)

{properties = adapter.GetIPProperties();.AppendText(" ");.AppendText(" " + adapter.Description);.AppendText("\r\n Type:" + adapter.NetworkInterfaceType + "\r\n");.AppendText(" Physical Address:" + adapter.GetPhysicalAddress().ToString() + "\r\n");versions = "";(adapter.Supports(NetworkInterfaceComponent.IPv4))

{= "IPv4";

}(adapter.Supports(NetworkInterfaceComponent.IPv6))

{(versions.Length > 0)

{+= " ";

}+= "IPv6";

}.AppendText(" IP version:" + versions + "\r\n");(properties);.AppendText(" DNS suffix:" + properties.DnsSuffix + "\r\n");

}

}Form1()

{();();

}void button1_Click(object sender, EventArgs e)

{.Clear();();sendMessage = txtBoxMessage.Text;[] data = Encoding.Unicode.GetBytes(sendMessage);.Write(data, 0, data.Length);= string.Empty;

}void Connection()

{

{= Dns.GetHostName();= new TcpClient(hostName, port);= tcpClient.GetStream();.Enabled = true;.Enabled = true;

}(Exception e)

{.Show(e.Message);

}

}void button3_Click(object sender, EventArgs e)

{();

}void button2_Click(object sender, EventArgs e)

{.Clear();.AppendText("WORKSTATION:\r\n");cl = new Class1();list = cl.GetServerList(Class1.SV_101_TYPES.SV_TYPE_WORKSTATION);(string name in list)

{.AppendText(" " + name + "\r\n");iphostentry = Dns.GetHostByName(name);nIP = 0;(IPAddress ipaddress in iphostentry.AddressList)

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

}

}sendMessage = txtBoxMessage.Text;[] data = Encoding.Unicode.GetBytes(sendMessage);.Write(data, 0, data.Length);= string.Empty;

}

}

}


СОДЕРЖАНИЕ ВВЕДЕНИЕ . ОБЗОР СОСТОЯНИЯ ВОПРОСА .1 Архитектура стека TCP/IP .2 Описание утилиты Ipconfig .3 Конфигурирование стека TCP/IP .4

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ