Главная страница
Навигация по странице:

  • Литература Джефри Рихтер:CLR via C Эндрю Троелсен:Язык программирования C 5.0 и платформа .net 4.5

  • Internet vs WWW Internet WWW Voice IP Social media Games e-Mail

  • Программа-Клиент и программа-сервер

  • Толстые клиенты

  • Клиент-серверная архитектура (Client-server pattern)

  • Получение адресов текущего компьютера

  • Датаграммный vs поточный сокеты Датаграмный (UDP) Потоковый (TCP)

  • Использование TCP сокета на клиенте

  • Использование TCP сокета на клиенте 2

  • Использование сокетов на сервере

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

  • Класс Socket - продолжение

  • Использование сокетов на сервере – пример кода

  • AddressFamily

  • Эта же информация от Microsoft « прослушивание с помощью сокетов » пример кода 2

  • Клиент - пример кода 2 Все то же, что и в Sever. Единственный новый метод - метод Connect()

  • Internet, IP адрес, Socket. c#_Internet, IP адрес, Socket. Программирование для Интернет


    Скачать 1.99 Mb.
    НазваниеПрограммирование для Интернет
    АнкорInternet, IP адрес, Socket
    Дата27.01.2022
    Размер1.99 Mb.
    Формат файлаpptx
    Имя файлаc#_Internet, IP адрес, Socket.pptx
    ТипЛекции
    #343773

    Internet, IP адрес, Socket

    Преподаватель: Ратт Алексей Васильевич


    ПЕРМСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ

    КАФЕДРА КОМПЬЮТЕРНЫХ СИСТЕМ И ТЕЛЕКОММУНИКАЦИЙ

    Программирование для Интернет (лекции)

    Литература

    Джефри Рихтер:

    CLR via C#

    Эндрю Троелсен:

    Язык программирования C# 5.0 и платформа .net 4.5

    Откуда еще брать информацию

    Интернет

    https://msdn.microsoft.com/ru-ru/library/

    https://docs.microsoft.com/ru-ru/dotnet

    https://stackoverflow.com/

    https://www.google.com/

    Internet vs WWW

    Internet

    WWW

    Voice IP

    Social media

    Games

    e-Mail

    всемирная система объединённых компьютерных сетей для хранения, обработки и передачи информации

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

    Программа-Клиент и программа-сервер

    Хорошо, а что такое клиент и что такое сервер? Разница между клиентом и сервером заключается в том, кто отправляет запрос, и кто его обрабатывает и отвечает на него.
    • Программа (Program) – набор инструкций (команд), которые должен будет выполнить компьютер.
    • Приложение (Application) – программа, предназначенная для конечного пользователя. С помощью приложения пользователь решает свои задачи (в общем смысле).
    • Часто не делают различия между этими понятиями.
    • Программное обеспечение (Software) – набор приложений и программ.

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

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

    Клиент-серверная архитектура (Client-server pattern)
    • Сервер – программа, которая обрабатывает запросы клиента, отвечает на них. Сервер предоставляет набор сервисов и функций, которыми пользуются клиенты. Важной возможностью сервера должна являться одновременная поддержка соединения с несколькими клиентами.
    • Клиент – программа, которая инициирует взаимодействие: клиент отправляет на сервер запрос. Это может быть запрос на выдачу информации или выполнение команды. Клиент инициирует и закрытие соединения.

    Клиент и сервер могут находиться как на разных компьютерах, так и на одном. В рамках нашего курса связь между клиентом и сервером осуществляется по сети Интернет на основе (по правилам) протоколов стека TCP/IP.

    Vocabulary

    Client ['klaɪənt] – клиент

    Server ['sɜːvə] – сервер

    Request [rɪ'kwest] – запрос

    Response [rɪ'spɔn(t)s] – ответ

    В то же время приемлемо говорить:

    «Клиент отправил реквѐст, но сервер не вернул респòнс»

    Адресация в интернете

    Интернет – всемирная система объединенных компьютерных сетей для хранения и передачи информации. Построена на базе стека протоколов TCP/IP.

    Немного о правилах русского языка: Можно писать как Интернет, так и интернет.

    Слово интернет относится ко 2-му склонению. Поэтому наш курс, вообще говоря, назван не совсем корректно.

    Протоколы – это правила передачи данных между узлами компьютерной сети.

    Стек протоколов TCP/IP – это система (упорядоченный набор) протоколов для организации интернета.

    Адрес узла в интернете – это его IP адрес или имя.

    Устройства (компьютеры), связанные сетью, называются узлами или хостами.

    Порты

    Порты могут принимать значения от 0 до 216 – 1, т.е. от 0 до 65535.

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

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

    Пример: в браузере вы набираете адрес хоста www.psu.ru без указания порта. Браузер по умолчанию пытается подключиться к веб-серверу, которые обычно принимают запросы через порт 80. Т.е. на самом деле браузер отправляет запрос на адрес www.psu.ru:80

    Номера специфических портов регистрирует Internet Assigned Numbers Authority

    0-1023 – системные (system) или общеизвестные (well-known) порты

    1024-49151 – зарегистрированные (registered) или пользовательские порты

    49152-65535 – динамические (dynamic) порты.

    На русском языке в wiki

    Клиент-Сервер, Порты

    Сервер:
    • слушает на определённом порту, заранее известном клиенту
    • занимает этот порт всё время, пока не завершит работу
    • об IP-адресе и номере порта клиента узнаёт из приглашения, посланного клиентом

    • Клиент:
    • заранее знает IP-адрес и порт сервера
    • выбирает у себя произвольный порт, который освобождает после окончания соединения
    • посылает приглашение к соединению

    Сервер при запуске сообщает Операционной Системе, что хотел бы «занять» определенный порт (или несколько портов). После этого все пакеты, приходящие на компьютер к этому порту, ОС будет передавать этому серверу. Говорят, что сервер «слушает» этот порт.

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

    Классы для адресов

    IPAddress ipFromByte = new IPAddress(new byte[] { 192, 168, 0, 1 });

    IPAddress ipFromString = IPAddress.Parse("192.168.0.1");

    IPAddress loopback = IPAddress.Loopback; // 127.0.0.1

    IPAddress broadcast = IPAddress.Broadcast; // 255.255.255.255

    IPAddress any = IPAddress.Any; // 0.0.0.0

    IP адреса

    IP адрес + № порта = конечная точка (End Point)

    IPEndPoint ep = new IPEndPoint(ipFromByte, 8000); // 192.168.0.1:8000

    Один компьютер может иметь несколько IP адресов в сети:

    IPHostEntry vk = Dns.GetHostEntry("vk.com");

    Console.WriteLine(vk.HostName);

    foreach (IPAddress ip in vk.AddressList)

    Console.WriteLine(ip.ToString());

    Получение адресов текущего компьютера

    string localHostName = Dns.GetHostName();

    IPHostEntry host = Dns.GetHostEntry(localHostName);

    Сначала получим информация о текущем хосте в виде объекта IPHostEntry

    Дальше нужно выбрать адрес из нужного семейства адресов:

    IPAddress ip = null;

    foreach (var address in host.AddressList)

    if (address.AddressFamily == AddressFamily.InterNetwork)

    ip = address;

    if (ip == null)

    throw new Exception("Appropriate address not found");

    Socket

    Сокет представляет одну сторону соединения между клиентом и сервером.

    Для установления соединения на обеих сторонах, у клиента и у сервера, должны существовать (быть открыты) свои сокеты.

    Мы будем различать следующие сокеты:
    • Датаграммный сокет: он еще называется UDP сокетом и сокетом без установки соединения. Доставка пакетов может осуществляться в произвольном порядке, да и вообще не гарантирована! Создается на стороне сервера и определяется двумя параметрами:
      • Локальный IP адрес
      • Локальный UDP порт
    • Потоковый сокет: использует протокол TCP. Гарантирует, не только факт доставки, но и то, что данные придут в том порядке, в каком были отправлены. Данные TCP сокеты определяются набором четырех полей:
      • Локальный IP адрес (Local IP address)
      • Локальный TCP порт (Local TCP port)
      • Удаленный IP адрес (Remote IP address)
      • Удаленный порт (Remote port)

    Датаграммный vs поточный сокеты

    Датаграмный (UDP)

    Потоковый (TCP)

    Стиль коммуникации

    Датаграммы

    Поток байтов

    Потеря данных

    Может произойти

    Недопустима

    Количество узлов (клиентов), получающих данных с этого сокета

    Произвольное количество

    1

    Количество идентифицирующих сокет параметров

    2

    4

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

    Передача данных по TCP

    Данные передаются порциями (chunks). Клиент (сервер) может отправить только одну строку «Hello world», а может отправить крупный видео-файл – все это chunks. Каждая такая порция – это определенный массив байтов.

    Для отправки по сети эти массивы дробятся на пакеты (packets).

    На другом конце данные собираются в потоки байтов.

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

    Программа-отправитель

    передает в сокет массив байтов byte[]

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

    Перед передачей byte[] разбивается на пакеты согласно протоколу TCP

    На другой стороне по протоколу TCP пакеты собираются обратно в исходный byte[]

    На другом конце программа получает

    от сокета массив byte[]

    Сетевая модель OSI

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

    Модель OSI

    Уровень (layer)

    Тип данных (PDU)

    Функции

    Примеры

    Уровень узла (хоста)

    7. Прикладной (application)

    Данные

    Доступ к сетевым службам

    HTTP, FTP, SMTP, RDP, SNMP

    6. Представительский (presentation)

    Представление и шифрование данных

    ASCII, EBCDIC, JPEG

    5. Сеансовый (session)

    Управление сеансом связи

    RPC, PAP

    4. Транспортный (transport)

    Сегменты (segment)/ Дейтаграммы (datagram)

    Прямая связь между конечными пунктами и надёжность

    TCP, UDP, SCTP, Ports

    Уровень среды

    3. Сетевой (network)

    Пакеты(packet)

    Маршрутизация и логическая адресация

    IPv4, IPv6, IPsec, AppleTalk

    2. Канальный (data link)

    Биты (bit)/ Кадры(frame)

    Физическая адресация

    PPP, IEEE 802.22, Ethernet, DSL, ARP, L2TP, Network Cards

    1. Физический (physical)

    Биты (bit)

    Работа со средой передачи, сигналами и двоичными данными

    USB, витая пара, коаксиальный кабель, оптический кабель

    Использование TCP сокета на клиенте

    Инициализация сокет

    Установка соединения Connect()

    Отправка запроса

    Send()

    Ожидание ответа

    Receive()

    IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });

    IPEndPoint ep = new IPEndPoint(ip, 8080);

    Socket socket = new Socket(

    AddressFamily.InterNetwork,

    SocketType.Stream, ProtocolType.Tcp);

    socket.Connect(ep);

    string message = "hello";

    socket.Send(Encoding.Unicode.GetBytes(message));

    byte[] buffer = new byte[1024];

    socket.Receive(buffer);

    Console.WriteLine("Response from server: {0}", Encoding.Unicode.GetString(buffer));

    socket.Close();

    Закрытие сокета

    Использование TCP сокета на клиенте 2

    Инициализация сокета

    Установка соединения Connect()

    Отправка/получение запроса в цикле

    Send()/Receive()

    Закрытие сокета

    Не обязательно сначала отправлять запрос и затем ожидать ответа: можно сразу начинать принимать информацию из сокета.

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

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

    Использование сокетов на сервере

    Инициализация сокета

    Привязка сокета к конечной точке Bind()

    Начало прослушивания (ожидания) входящих соединений Listen()

    Прием входящего соединения Accept() и создание сокета для этого подключения

    Отправка/получение запроса в цикле

    Send()/Receive()

    Закрытие сокета

    Работа с сокетами в .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

    Свойство или метод

    Описание

    AddressFamily

    Дает семейство адресов сокета — значение из перечисления Socket.AddressFamily.

    Available

    Возвращает объем доступных для чтения данных.

    Blocking

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

    Connected

    Возвращает значение, информирующее, соединен ли сокет с удаленным хостом.

    LocalEndPoint

    Дает локальную конечную точку.

    ProtocolType

    Дает тип протокола сокета.

    RemoteEndPoint

    Дает удаленную конечную точку сокета.

    SocketType

    Дает тип сокета.

    Класс Socket - продолжение

    Свойство или метод

    Описание

    Accept()

    Создает новый сокет для обработки входящего запроса на соединение.

    Bind()

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

    Close()

    Заставляет сокет закрыться.

    Connect()

    Устанавливает соединение с удаленным хостом.

    GetSocketOption()

    Возвращает значение SocketOption.

    IOControl()

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

    Класс Socket - продолжение

    Свойство или метод

    Описание

    Listen()

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

    Receive()

    Получает данные от соединенного сокета.

    Poll()

    Определяет статус сокета.

    Select()

    Проверяет статус одного или нескольких сокетов.

    Send()

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

    SetSocketOption()

    Устанавливает опцию сокета.

    Shutdown()

    Запрещает операции отправки и получения данных на сокете.

    Использование сокетов на сервере – пример кода

    IPAddress ip = new IPAddress(new byte[] { 192, 168, 0, 4 });

    IPEndPoint ep = new IPEndPoint(ip, port);

    Socket listenSocket = new Socket(AddressFamily.InterNetwork,

    SocketType.Stream, ProtocolType.Tcp);

    listenSocket.Bind(ep);

    listenSocket.Listen(100);

    while (true) {

    Socket incomingCall = listenSocket.Accept();

    StringBuilder builder = new StringBuilder();

    int bytes = 0; // number of accepted bytes (see Receive)

    byte[] data = new byte[1024]; // buffer for incoming data

    bytes = incomingCall.Receive(data);

    Console.WriteLine(Encoding.Unicode.GetString(data, 0, bytes));

    data = Encoding.Unicode.GetBytes("response");

    incomingCall.Send(data);

    incomingCall.Shutdown(SocketShutdown.Both);

    incomingCall.Close();

    }

    Что значит – 100 ?

    Сервер - пример кода 2

    // Устанавливаем для сокета локальную конечную точку

    IPHostEntry ipHost = Dns.GetHostEntry("localhost");

    IPAddress ipAddr = ipHost.AddressList[0];

    IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 8000);

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

    пример кода 2

    Перечисление AddressFamily указывает схемы адресации, которые экземпляр класса Socket может использовать для разрешения адреса.

    В параметре SocketType различаются сокеты TCP и UDP. В нем можно определить в том числе следующие значения: Raw (доступ к транспортному протоколу) или Stream - Поддерживает потоковые сокеты. Значение Stream требует указать Tcp для типа протокола.

    Третий параметр определяет тип протокола, требуемый для сокета. В параметре РrotocolType можно указать следующие наиболее важные значения - Tcp, Udp, Ip, Raw.

    // Создаем сокет Tcp/Ip

    Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

    пример кода 2

    Метод Bind() связывает сокет с локальной конечной точкой. Вызывать метод Bind() надо до любых попыток обращения к методам Listen() и Accept()

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

    Далее по схеме Accept() - согласие на соединение с клиентом

    while (true)

    {

    ---

    Socket handler = sListener.Accept();

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

    sListener.Bind(ipEndPoint);

    sListener.Listen(10);

    Эта же информация от Microsoft «прослушивание с помощью сокетов»

    пример кода 2

    Как только клиент и сервер установили между собой соединение, можно отправлять и получать сообщения, используя методы Send() и Receive() класса Socket.

    Когда обмен данными между сервером и клиентом завершается, нужно закрыть соединение используя методы Shutdown() и Close():

    handler.Shutdown(SocketShutdown.Both);

    handler.Close();

    SocketShutdown — это перечисление, содержащее три значения для остановки: Both - останавливает отправку и получение данных сокетом, Receive - останавливает получение данных сокетом и Send - останавливает отправку данных сокетом.

    Клиент - пример кода 2

    Все то же, что и в Sever. Единственный новый метод - метод Connect(), используется для соединения с удаленным сервером

    Стандартное взаимодействие клиента и сервера

    Socket

    Connect

    Send

    Receive

    Клиент

    Сервер

    Socket

    Bind

    Listen

    Accept, создание сокета входящего подключения

    Receive

    Обработка запроса

    Send

    Формирование виртуального канала, трубы для передачи данных

    Ответ (Response)

    Запрос (Request)


    написать администратору сайта