Формат inband-сообщений

Передача inband-сообщений включается свойством sock.inbandcommands.

Каждое inband-сообщение должно начинаться со специального escape-символа, ASCII-код которого задаётся свойством sock.escchar. Следующий за ним символ может иметь любой ASCII-код, кроме кода самого escape-символа.

Дальше идёт тело inband-сообщения. Последний символ сообщения - так называемый завершающий символ, задаваемый свойством sock.endchar. Он сигнализирует о конце inband-сообщения и возврате к «обычным» данным.

Жёстких ограничений на длину inband-сообщения нет. Она ограничена только тем, сколько места вы выделите под буферы CMD и RPL, в которых хранятся входящие и исходящие inband-сообщения.

А что, если сам поток данных содержит символ (или символы) с ASCII-кодом заданного вами escape-символа? Не решит ли сокет, что это начало inband-команды? Чтобы избежать такой ситуации, символ данных с кодом escape-символа передаётся как два одинаковых символа с одним и тем же ASCII-кодом.

Пример: допустим, у вас такая настройка:

...
sock.inbandcommands= YES
sock.escchar=`$`
sock.endchar=`%`
...

Теперь в сокет поступает такой поток данных:

ABCD$#inband command%EFG$$123

Сокет воспримет этот поток как содержащий одну inband-команду («$#inband command%»), а обычные данные («ABCDEFG$123») попадут в буфер RX сокета. Первый символ «$» воспринимается как начало inband-сообщения, потому что за ним следует другой символ («#»). Второе вхождение символа «$» воспринимается как данные, поскольку за ним следует ещё один символ «$». В итоговом потоке данных остаётся всего один символ «$» - второй сокет удаляет автоматически.

При отправке данных из буфера TX сокет также автоматически удваивает все символы данных с ASCII-кодом escape-символа. Так, если вы хотите отправить строку «Outbound$!», на самом деле будет отправлено:

Outbound$$!
Совет

Inband-сообщения придуманы не в Tibbo. Многие программы считают escape-символом символ с кодом 255.

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