Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Екзамен з комп. арх..doc
Скачиваний:
4
Добавлен:
17.09.2019
Размер:
449.02 Кб
Скачать

37. Загальна схема та реалізація багатопоточного сокетного сервера зі з’єднанням.

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

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

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

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

Чтобы настроить серверный TCP-сокет в управляемом коде, прежде всего нужно создать экземпляр класса Socket. Его конструктор принимает три параметра: AddressFamily, SocketType и ProtocolType. Параметр AddressFamily определяет используемую сокетом схему адресации. Чаще всего в качестве этого параметра используются значения InterNetwork (для адресов IPv4) и InterNetworkV6 (для адресов IPv6). Параметр SocketType определяет тип коммуникационной связи, осуществляемой при помощи сокета; к двум наиболее распространенным типам относятся Stream (для сокетов, ориентированных на логические соединения) и Dgram (если сокет не требует логических соединений). Параметр ProtocolType определяет применяемый сокетом протокол и принимает такие значения, как Tcp, Udp, Idp, Ggp и т. д.

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

Объект IPEndPoint является логическим представлением конечной точки при сетевой коммуникации и включает данные об IP-адресе и порте. Конструктор IPEndPoint принимает IP-адрес и номер порта. Номер порта - это просто целочисленный тип, определяющий используемый порт, а IP-адрес может быть представлен .NET-классом IPAddress или длинным целым числом (при этом каждый из сегментов IP-адреса представляется одним байтом целочисленного типа). Класс IPAddress содержит несколько предопределенных IP-адресов, для доступа к которым служат статические свойства; двумя самыми полезными адресами при работе с TCP-сокетами являются IPAddress.Loopback и IPAddress.Any.

Свойство IPAddress.Loopback представляет адрес обратной связи, т. е. локальный адрес компьютера (127.0.0.1). Этот адрес не имеет никакого отношения ни к оборудованию, ни к сетевой связи — он позволяет выполнять локальное тестирование даже в отсутствие сети и сетевого оборудования. Именно он используется, когда вы указываете в качестве имени хоста «localhost», хотя это можно изменить, отредактировав файл hosts в каталоге %windir%\system32\drivers\etc.

Свойство IPAddress.Any (0.0.0.0) указывает серверу задействовать для прослушивания клиентских запросов все сетевые интерфейсы, а не только интерфейс, сопоставленный с конкретным IP-адресом (в этом отношении UDP- и TCP-сокеты немного различаются). Почему бы не использовать это свойство всегда? Ну, во-первых, тогда вы не сможете контролировать, кто подключается к вашему серверу. Если у сервера несколько сетевых адаптеров, вы можете прослушивать соединения на одном интерфейсе (например, подключенном к корпоративной сети) и блокировать другой интерфейс (скажем, подключенный к интернету), задав сетевой адрес, на котором нужно вести прослушивание.

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

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

В табл. 1 обобщены этапы создания серверного и клиентского сокетов. Как видите, основы работы с сокетами на самом деле просты — гораздо сложнее использовать сокеты эффективно.

Табл.1.Стандартные вызовы клиентских и серверных сокетов

Сервер

Клиент

Socket.Socket

Socket.Socket

Socket.Bind

Socket.Bind (необязательный вызов)

Socket.Listen

Socket.Connect

Socket.Accept

Socket.Read/Socket.Write

Socket.Read/Socket.Write

Socket.Shutdown (необязательный вызов)

Socket.Shutdown (необязательный вызов)

Socket.Close

Socket.Close