Установка исходящих соединений

Выполнение активного открытия

Мы узнали, как настроить сокеты на приём входящих соединений TCP и «соединений» UDP, и теперь переходим к установке собственных соединений, или, как часто говорят, к «активному открытию».

Установка исходящего соединения - всегда явное действие: чтобы попытаться его выполнить, используется метод sock.connect. После вызова сокет попытается выполнить активное открытие на IP-адрес и порт, заданные свойствами sock.targetip и sock.targetport. Есть также свойство sock.targetinterface - оно определяет, через какой сетевой интерфейс пойдёт новое соединение.

Совет

Как видите, свойства sock.targetip и sock.targetport выполняют двойную работу. Для входящих соединений они определяют (если этого требует sock.inconmode), кто сможет подключиться к сокету. Для исходящих соединений эта пара задаёт IP-адрес и порт хоста, к которому сокет попытается подключиться.

Обратите внимание: вызов sock.connect сработает, только если сокет находится в состоянии «closed» (закрыт); см. раздел Проверка состояния соединения.

Активное открытие для TCP

Когда вы велите «TCP»-сокету подключиться, он делает следующее:

  • Определяет IP-адрес цели с помощью протокола разрешения адресов (ARP).
  • Пытается провести с целью стандартную последовательность установки соединения TCP (SYN-SYN-ACK).
  • Соединение либо будет установлено, либо попытка не удастся. Ваша программа может это отследить - см. раздел Проверка состояния соединения.
Совет

Если сказанное ни о чём вам не говорит, не беспокойтесь. Это действительно очень технические детали, и полностью понимать их для работы с объектом sock. не обязательно.

«Активное открытие» для UDP

Когда вы велите «UDP»-сокету подключиться, он просто определяет IP-адрес цели и считает «соединение» установленным.

Не забывайте: работа с соединениями полностью асинхронна!

Помните, что объект sock. обрабатывает обмен данными асинхронно. Когда VM выполняет метод sock.connect, это не значит, что к моменту перехода VM к следующей инструкции программы соединение уже установлено. Выполнение sock.connect лишь поручает главному процессу начать установку соединения. Это может занять некоторое время, и вашему приложению не нужно ждать завершения. В разделе Проверка состояния соединения объясняется, как в любой момент узнать фактическое состояние соединения (см. свойства sock.state и sock.statesimple, только чтение).

Внимание

Асинхронная природа объекта sock. имеет несколько интересных следствий. В теме Подробнее об асинхронной природе сокета есть важная информация на этот счёт, обязательно прочитайте её!

Исходный материал Tibbo обновлён 10 августа 2022Оригинал на docs.tibbo.com · Сообщить об ошибке