Алгоритм построения Клиента на базе ТСР
Класс Socket пространства имен System.Net.Sockets
Свойство | Описание |
AddressFamily | Дает семейство адресов сокетов – значение из перечисления Socket.AddressFamily |
Available | Возвращает объем доступных для чтения данных. |
Blocking | Дает или устанавливает значение находится ли сокет в блокирующем состоянии |
Connected | Возвращает значение, информирующее соединен ли сокет с удаленным хостом |
LocalEndPoint | Дает локальную конечную точку |
ProtocolType | Дает тип протокола сокета |
RemoteEndPoint | Дает удаленную конечную точку |
SocketType | Дает тип сокета |
Методы класса Socket
Методы | Описание |
Accept( ) | Создает новый сокет для обработки входящего запроса на соединение |
Bind () | Связывает сокет с локальной конечной точкой для ожидания входящих запросов на соединение |
Close ( ) | Закрывает сокет |
Connect ( ) | Устанавливает соединение с удаленным хостом |
Listen ( ) | Помещает сокет в режим прослушивания. Предназначен только для серверных приложений |
Receive ( ) | Получает данные от соединенного сокета |
Select ( ) | Проверяет статус одного или нескольких сокетов |
Send ( ) | Отправляет данные соединенному сокету |
Poll ( ) | Определяет статус сокета |
SetSocketOption | Устанавливает опцию сокета |
Shutdown () | Запрещает операции получения и отправки на сокете |
Задание 1: Создать приложение на потоковом сокете ТСР.
Сервер построен синхронно, выполнение потока блокируется, пока сервер не даст согласие на соединение с клиентом. Клиент завершает соединение с сервером, отправляя серверу сообщение <The End>.
Алгоритм:
Установить для сокета локальную конечную точку. Создать IPEndPoint для сервера, комбинируя первый IP адрес хост компьютера, полученный от метода Dns.Resolve (), и номер порта. Хост – компьютер –localhost, номер порта – 11000.
Перечисление AddressFamaly указывает схемы адресации для разрешения адреса.
Параметр SocketType поддерживает следующие параметры:
Dgram | Поддерживает дейтаграммы. Значение Dgram требует указать Udp для типа протокола и InterNetwork в параметре адресов. |
Raw | Поддерживает доступ к базовому транспортному протоколу. |
Stream | Поддерживает потоковые сокеты. Требует указать Тср для типа протокола и InterNetwork в параметре адресов. |
Следующим шагом должно быть назначение сокета с помощью метода Bind (). Когда сокет открывается конструктором, ему не назначается имя, а резервируется дескриптор.
Чтобы сокет клиента мог идентифицировать потоковый сокет Тср, серверная программа должна дать имя своему сокету.
try
{
sListener.Bind(ipEndPoint);
после создания и связывания имени, прослушиваем входящие сообщения.
sListener.Listen(10);
в параметре определяется максимальное число соединений, ожидающих обработки в очереди.
В состоянии прослушивания надо быть готовым дать согласие на соединение с клиентом, для чего используется метод Accept(). Он блокирует поток вызывающей программы до поступления соединения. Этот метод извлекает из очереди ожидающих запросов первый запрос и создает для его обработки новый сокет. Хотя новый сокет создан, первоначальный сокет продолжает слушать и может быть использован с многопоточной обработкой для приема нескольких запросов на соединение от клиентов. Серверное приложение не должно закрывать слушающий сокет. Он должен продолжать работать на ряду с сокетами, созданными методом Accept().
//начинаем слушать соединения
Когда клиент и сервер установили соединение, можно отправлять и получать сообщения, используя методы Send () и Receive().
Метод Receive() получает данные от сокета и заполняет массив байтов, переданный в качестве аргумента. Возвращаемое методом значение – фактически считанное количество байтов.
Если символы конца сообщения в строке не найдены, продолжается ожидание входящих данных, иначе сообщение отображается на консоли.
При выходе из цикла создаем новый массив байтов для ответа, который нужно послать клиенту.
При завершении обмена данными закрывается соединение методом Close () . для гарантии, что никаких не обработанных данных не осталось перед этим методом, вызывается метод Shutdown().
Для каждого экземпляра сокета успешно выполнившего свою работу, обязательно нужно вызывать метод Close ().
SocketShutdown – это перечисление, содержащее три значения для остановки сокета.
Both | Останавливает отправку и получение данных |
Receive | Останавливает получение данных сокетом |
Send | Останавливает отправку данных сокетом |
Сокет закрывается при вызове метода Close (), который также устанавливает в свойстве Connected сокета значение false.
Алгоритм построения Клиента на базе ТСР.
Как и для сервера используются те же методы для определения конечной точки, создания экземпляра сокета, отправки и получения данных, закрытия сокета.
Сначала нужно установить удаленную конечную точку.
Получив сокет, метод Connect () устанавливает соединение между сокетом и удаленной точкой, заданной в параметре. Установив соединение, можно отправить данные и получить ответ.
Задание 2: Создать программу сканирования портов.
Программа пытается соединится с localhost по каждому порту, сообщается об успешности соединения, если соединение установить не удается перехватывается исключение SocketException.
Алгоритм:
- Получение IP адреса локальной машины.
- Перебираем в цикле номера портов.
- Установление конечной точки. (в try)
- Создание потокового сокета.
- Соединение сокета с конечной точкой.
- Вывод сообщения о прослушивании порта.
- Обработка исключений (catch), объявить переменную типа SocketException
- Если код сообщения не равен 10061, что соответсвует сообщению о попытке соединения с закрытым портом, то выводится текст сообщения исключения
Задание 3: Создать клиент – серверное приложение, которое переданную информацию со стороны клиента считывает в файл.
Задание 4: Добавить в приложение подтверждения от сервера в ответ на переданные ему пакеты.
КОНТРОЛЬНЫЕ ВОПРОСЫ: