Приём входящих соединений

Главный выключатель входящих соединений

Приём входящих соединений можно глобально включить или отключить сразу для всех сокетов, независимо от настроек отдельных сокетов. Для этого служит свойство sock.inconenabledmaster. По умолчанию оно равно 1 - YES (да).

Кто может подключаться к вашему сокету

Свойство sock.inconmode («режим входящих соединений») позволяет определить, принимаются ли входящие соединения и, если да, то от кого. По умолчанию (0 - PL_SOCK_INCONMODE_NONE) входящие соединения не разрешены вообще. Для TCP это означает, что запросы на входящее соединение отклоняются. Для UDP входящие датаграммы просто игнорируются.

Если вас устраивает приём входящего соединения от любого хоста и порта, задайте sock.inconmode = 3 - PL_SOCK_INCONMODE_ANY_IP_ANY_PORT. Тогда подключиться к сокету сможет любой желающий, если он использует правильный транспортный протокол (его вы задаёте свойством sock.protocol) и подключается к нужному номеру порта (подробнее об этом ниже).

Если нужно принимать соединения только от определённого хоста сети, задайте sock.inconmode = 2 - PL_SOCK_INCONMODE_SPECIFIC_IP_ANY_PORT. Тогда подключиться к сокету сможет только хост, IP-адрес которого совпадает с заданным в свойстве sock.targetip.

Ограничения можно ужесточить: потребовать, чтобы не только IP-адрес другого хоста совпадал с заданным в sock.targetip, но и порт, с которого исходит соединение, совпадал с портом, заданным в свойстве sock.targetport. Для этого задайте sock.inconmode = 1 - PL_SOCK_INCONMODE_SPECIFIC_IPPORT.

Вот пример, как принимать входящие соединения TCP только от хоста с IP-адресом 192.168.100.40 и портом 1000:

sock.protocol= PL_SOCK_PROTOCOL_TCP
sock.inconmode= PL_SOCK_INCONMODE_SPECIFIC_IPPORT
sock.targetip= "192.168.1.40"
sock.targetport= 1000

Объект sock. отклоняет входящее соединение, отправляя пакет сброса TCP. Так другой хост мгновенно узнаёт об отказе. Есть исключение - см. раздел Поведение сокета в режиме HTTP.

Порты прослушивания

Порты, на которых сокет принимает входящее соединение, называются «портами прослушивания». Они задаются двумя свойствами: sock.localportlist и sock.httpportlist. Обратите внимание, что оба свойства строкового типа, поэтому каждое может принимать список портов.

Например, задайте sock.localportlist = "1001,2000,3000", чтобы принимать обычное соединение для передачи данных на порт 1001, 2000 или 3000. Пока соединение активно, можно проверить, какой из локальных портов сокета в нём задействован. Для этого служит свойство sock.localport (только чтение).

Для соединений UDP достаточно sock.localportlist. Для TCP, который может использоваться для «простого» обмена данными или для HTTP, есть ещё одно свойство - sock.httpportlist. Чтобы сокет принял входящее соединение TCP, оно должно быть направлено либо на один из портов sock.localportlist, либо на один из портов sock.httpportlist. Если соединение принято на одном из портов из sock.httpportlist, сокет автоматически переключается в режим HTTP.

Пример:

sock.localportlist = "1001,2000"
sock.httpportlist = "80"

Это означает, что любое входящее соединение TCP, направленное на порт 1001 или 2000, будет воспринято как обычное соединение для передачи данных. Если соединение направлено на порт 80, оно будет принято как HTTP-соединение.

А что, если один и тот же порт указан и в sock.localportlist, и в sock.httpportlist?

sock.localportlist = "1001,2000,80"
sock.httpportlist = "80"

В этом примере, если входящее соединение направлено на «наш» порт 80 и протокол TCP, будет включён режим HTTP: у sock.httpportlist приоритет выше, чем у sock.localportlist. Конечно, для UDP sock.httpportlist не имеет значения, поскольку HTTP возможен только поверх TCP!

Разрешённые интерфейсы

Объект sock. не зависит от интерфейса и поддерживает связь по нескольким интерфейсам. Свойство sock.allowedinterfaces определяет список интерфейсов, на которых текущий сокет принимает входящие соединения. Список зависит от платформы. Чтобы узнать, какие интерфейсы доступны, обратитесь к документации по платформе вашего устройства (например, для EM1000 она находится здесь).

Свойство sock.allowedinterfaces хранит строку со списком всех интерфейсов, которые сокет будет прослушивать:

sock.allowedinterfaces = "NET,WLN" 'listen on Ethernet and Wi-Fi interfaces

Соединения принимаются даже при приостановленной VM

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

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