Отправка inband-ответов
Правильное формирование inband-ответа
Inband-ответы отправляются из буфера RPL. В отличие от «обычных» данных TX, для которых нужны методы sock.setdata и sock.send, отправка inband-ответа выполняется за один шаг. Данные задаются и отправляются (фиксируются) одним методом - sock.setsendinband.
Метод sock.setsendinband помещает данные в буфер RPL и сразу фиксирует их для отправки. Сокет не добавляет нужную обвязку автоматически: добавить escape-символ, другой символ после escape-символа и завершающий символ должно ваше приложение.
Ваш inband-ответ будет сохранён в буфере RPL, только если там достаточно места для всего сообщения. Если свободного места не хватает, не будет сохранено ничего. Это отличается от буфера TX, куда сохраняется всё, что поместится. Свободное место в буфере RPL можно проверить с помощью свойства только чтение sock.rplfree. Объём неотправленных данных в буфере RPL можно узнать из свойства только чтение sock.rpllen.
Inband-ответ нельзя разбивать - он должен помещаться в буфер RPL одним вызовом sock.setsendinband. В примере ниже мы отвечаем «OK» на каждую принятую inband-команду:
sub on_sock_inband
dim s as string 'we will keep the data from the CMD buffer here
dim s2 as string 'this will keep individual inband commands
dim x as byte
s=sock.getinband 'we get entire CMD buffer contents into the s
x=instr(1,s,chr(sock.endchar))
while x<>0
s2=left(s,x-1) 's2 now contains a single inband command
s=right(s,len(s)-x) 'cut out this command
'reply back with OK
sock.setsendinband(chr(sock.escchar)+" OK"+chr(sock.endchar))
'any more inband commands to process now?
x=instr(1,s,chr(sock.endchar))
wend
end sub
Чтобы этот пример работал хорошо, размер буфера CMD не должен превышать ёмкость строковой переменной s. Тогда всё, что извлечено из буфера CMD, всегда поместится в s. Если буфер больше ёмкости s, потребуется немного более сложная обработка.
А вот неправильный способ - не разбивайте inband-ответы!
...
sock.setsendinband(chr(sock.escchar)) 'WRONG!
sock.setsendinband(" OK") 'WRONG!
sock.setsendinband(chr(sock.endchar)) 'WRONG!
...
Обратите внимание, как мы создали символ после escape-символа - добавили пробел перед ответом «OK». Это сработает, если только escape-символ не является пробелом!