Сделай Сам Свою Работу на 5

Потоковые сокеты (stream socket)





Лабораторная работа №17 2.

Тема: Реализация механизмов работы в сети

Цель работы: понять принципы работы сетевых приложений, разобраться в примерах, научится писать собственные сетевые приложения.

 

Время на выполнение работы: 2 часа

Этапы работы:

I.Ознакомиться с теоретическими сведениями.

II.Выполнить задания, предложенные преподавателем.

III.Ответить на контрольные вопросы.

 

Теоретические сведения.

Теоретические сведения

Классы .NET для IP-адресов

C# и .NET --- Сетевое программирование --- Классы .NET для IP-адресов

В Интернете серверы и клиенты идентифицируются по IP-адресу либо имени хоста (также известному, как DNS-имя). В общем случае, имя хоста — это дружественное для человека имя, которое вводится в поле адреса веб-браузера, такое как www.professorweb.ru или www.microsoft.com. IP-адрес — это идентификатор, используемый компьютерами для опознания друг друга. IP-адреса представляют собой идентификаторы, применяемые для обеспечения достижения запросами и ответами соответствующих машин. Один компьютер может даже иметь несколько IP-адресов.

В наше время IP-адреса обычно представлены 32-битным значением. Вот пример 32-битного IP-адреса: 192.168.1.100. Этот формат IP-адреса определен в протоколе Internet Protocol version 4.



Поскольку количество компьютеров и прочих устройств, претендующих на место в Интернете, неуклонно растет, была разработана более новая система адресации — Internet Protocol version 6. Протокол IPv6 предоставляет 64-битные IP-адреса. IPv6 потенциально может представить до 3e+28 уникальных адресов. Среда .NET Framework позволяет приложениям работать как с IPv4, так и с IPv6.

Чтобы имена хостов работали, сначала должен быть отправлен сетевой запрос на трансляцию имени хоста в IP-адрес; эту задачу решает один или более DNS-серверов.

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

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



В .NET Framework предлагается множество классов, которые помогают в процессе поиска IP-адресов и нахождении информации о компьютерах-хостах.

Класс IPAddress

Класс IPAddress представляет IP-адрес. Сам адрес доступен в виде свойства GetAddressBytes и может быть преобразован в десятичный формат с разделителями-точками с помощью метода ToString(). В этом классе также реализован статический методParse(), который эффективно выполняет преобразование, обратное ToString() — из десятичного формата с разделителями-точками в IPAddress:

IPAddress ip = IPAddress.Parse("234.58.78.9");

byte[] adress = ip.GetAddressBytes();

string ipString = ip.ToString();

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

IPAddress.None

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

IPAddress.Loopback

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

IPAddress.Broadcast

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

IPAddress.Any

У компьютера может быть несколько сетевых плат с несколькими IP-адресами. Сокет использует IPAddress.Any, чтобы ожидать действия на любом из этих сетевых интерфейсов.



Класс IPHostEntry

Класс IPHostEntry инкапсулирует информацию об определенном компьютере-хосте. Этот класс делает имя хоста доступным через свойство HostName (которое возвращает строку), а свойство AddressList возвращает массив объектов IPAddress.

Класс Dns

Класс Dns способен взаимодействовать с DNS-сервером по умолчанию для извлечения IP-адреса. Он имеет два важных статических метода — GetHostEntry(), который использует DNS-сервер для получения деталей хоста по заданному его имени, и GetHostByAddress(), который также возвращает детали хоста, но на этот раз используя IP-адрес. Оба метода возвращают объект IPHostEntry.

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

Давайте рассмотрим пример WPF-приложения, использующего возможности класса Dns:

public MainWindow()

{

InitializeComponent();

 

string hostname = "www.google.com", message = "IP адреса для домена " + hostname + "\n";

IPHostEntry entry = Dns.GetHostEntry(hostname);

 

foreach (IPAddress a in entry.AddressList)

message += " --> "+ a.ToString() + "\n";

 

message += "\nАльтернативное имя домена: ";

foreach (string aliasName in entry.Aliases)

message += aliasName + "\n";

 

message += "\nРеальное название хоста: " + entry.HostName;

MessageBox.Show(message);

}

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

Первоначально сокеты были разработаны для UNIX в Калифорнийском университете в Беркли. В UNIX обеспечивающий связь метод ввода-вывода следует алгоритму open/read/write/close. Прежде чем ресурс использовать, его нужно открыть, задав соответствующие разрешения и другие параметры. Как только ресурс открыт, из него можно считывать или в него записывать данные. После использования ресурса пользователь должен вызывать метод Close(), чтобы подать сигнал операционной системе о завершении его работы с этим ресурсом.

Когда в операционную систему UNIX были добавлены средства межпроцессного взаимодействия (Inter-Process Communication, IPC) и сетевого обмена, был заимствован привычный шаблон ввода-вывода. Все ресурсы, открытые для связи, в UNIX и Windows идентифицируются дескрипторами. Эти дескрипторы, или описатели (handles), могут указывать на файл, память или какой-либо другой канал связи, а фактически указывают на внутреннюю структуру данных, используемую операционной системой. Сокет, будучи таким же ресурсом, тоже представляется дескриптором. Следовательно, для сокетов жизнь дескриптора можно разделить на три фазы: открыть (создать) сокет, получить из сокета или отправить сокету и в конце концов закрыть сокет.

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

Типы сокетов

Существуют два основных типа сокетов — потоковые сокеты и дейтаграммные.

Потоковые сокеты (stream socket)

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

Потоковый сокет гарантирует исправление ошибок, обрабатывает доставку и сохраняет последовательность данных. На него можно положиться в доставке упорядоченных, сдублированных данных. Потоковый сокет также подходит для передачи больших объемов данных, поскольку накладные расходы, связанные с установлением отдельного соединения для каждого отправляемого сообщения, может оказаться неприемлемым для небольших объемов данных. Потоковые сокеты достигают этого уровня качества за счет использования протокола Transmission Control Protocol (TCP). TCP обеспечивает поступление данных на другую сторону в нужной последовательности и без ошибок.

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

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

Потоки базируются на явных соединениях: сокет А запрашивает соединение с сокетом В, а сокет В либо соглашается с запросом на установление соединения, либо отвергает его.

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

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

Работа с сокетами в .NET

Поддержку сокетов в .NET обеспечивают классы в пространстве имен System.Net.Sockets — начнем с их краткого описания.

Классы для работы с сокетами
Класс Описание
MulticastOption Класс MulticastOption устанавливает значение IP-адреса для присоединения к IP-группе или для выхода из нее.
NetworkStream Класс NetworkStream реализует базовый класс потока, из которого данные отправляются и в котором они получаются. Это абстракция высокого уровня, представляющая соединение с каналом связи TCP/IP.
TcpClient Класс TcpClient строится на классе Socket, чтобы обеспечить TCP-обслуживание на более высоком уровне. TcpClient предоставляет несколько методов для отправки и получения данных через сеть.
TcpListener Этот класс также построен на низкоуровневом классе Socket. Его основное назначение — серверные приложения. Он ожидает входящие запросы на соединения от клиентов и уведомляет приложение о любых соединениях.
UdpClient UDP — это протокол, не организующий соединение, следовательно, для реализации UDP-обслуживания в .NET требуется другая функциональность.
SocketException Это исключение порождается, когда в сокете возникает ошибка.
Socket Последний класс в пространстве имен System.Net.Sockets — это сам класс Socket. Он обеспечивает базовую функциональность приложения сокета.

Класс Socket

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

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

Свойства и методы класса Socket
Свойство или метод Описание
AddressFamily Дает семейство адресов сокета — значение из перечисления Socket.AddressFamily.
Available Возвращает объем доступных для чтения данных.
Blocking Дает или устанавливает значение, показывающее, находится ли сокет в блокирующем режиме.
Connected Возвращает значение, информирующее, соединен ли сокет с удаленным хостом.
LocalEndPoint Дает локальную конечную точку.
ProtocolType Дает тип протокола сокета.
RemoteEndPoint Дает удаленную конечную точку сокета.
SocketType Дает тип сокета.
Accept() Создает новый сокет для обработки входящего запроса на соединение.
Bind() Связывает сокет с локальной конечной точкой для ожидания входящих запросов на соединение.
Close() Заставляет сокет закрыться.
Connect() Устанавливает соединение с удаленным хостом.
GetSocketOption() Возвращает значение SocketOption.
IOControl() Устанавливает для сокета низкоуровневые режимы работы. Этот метод обеспечивает низкоуровневый доступ к лежащему в основе классу Socket.
Listen() Помещает сокет в режим прослушивания (ожидания). Этот метод предназначен только для серверных приложений.
Receive() Получает данные от соединенного сокета.
Poll() Определяет статус сокета.
Select() Проверяет статус одного или нескольких сокетов.
Send() Отправляет данные соединенному сокету.
SetSocketOption() Устанавливает опцию сокета.
Shutdown() Запрещает операции отправки и получения данных на сокете.

Пример программы

Дополнительная библиотека

 

 

Сервер

Специальный объект для многопоточности

 


 

Сам сервер:

 

 


 

Клиент:


 

Задание

Вам необходимо по примеру выше, реализовать свое собственное клиент-серверное приложение. Желательно использовать протокол TCP(т.к. он указан в примере).Лабораторная работа выполняется парами. Один пишет клиент, второй – сервер.

Если игра на очки, то на сервере хранится лог с очками. И в конце пользователю присылается его место.

Вариант

1. Угадай слово. У клиента 10 попыток. Он знает количество букв и может называть в попытку любую букву.

2. Угадай слово. Клиент получает очки, чем быстрее отгодает, тем больше получит. Он знает количество букв и может называть в попытку любую букву.

3. Угадай число от 1 до 100. Клиент получает очки, чем быстрее отгадает, тем больше получит. При каждом ответе он получает информацию горячо(разность <2), тепло (разность<5), прохладно(разность<10), холодно(разность <20), мороз(разность > 20).

4. Игра камень-ножницы-бумага до X побед. Выбирает пользователь вначале.

5. Правильно ли написано слово. Сервер присылает слово пользователь отвечает правильно или нет. Игра на очки. 10 попыток.

6. Реши пример. Примеры вида A X B X C =? , где A,B,C – это числа, а X – арифметические действия +,-,*. Игра на очки.

7. Реши уравнение Ax2 + B x +C = 0. Игра на очки.

 

Контрольные вопросы:

1. Назначение класса Dns?

2. Назначение класса IPAddress?

3. Назначение класса TcpClient?

4. Назначение класса в программе Thread?

5. Назначение класса TcpListener?

6. Назначение класса NetworkStream?

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.