Перенаправление буферов
Следующий пример приводился в разделе Приём данных в режиме TCP:
sub on_sock_data_arrival
sock.setdata(sock.getdata(sock.txfree))
sock.send
end sub
Он показывает, как отправить все данные, поступающие в буфер RX, из буфера TX всего двумя строками кода. Как бы быстро это ни работало, все данные всё равно проходят через ваш код на Tibbo BASIC/C, хотя вы их никак не обрабатываете (не изменяете, не выбираете).
Намного эффективнее и «продвинутее» использовать приём, называемый перенаправлением буферов (замыканием буферов). При замыкании буферов данные принимаются не в буфер RX вашего сокета, а напрямую в буфер TX другого объекта, который должен эти данные отправить. Это может быть сокет (тот же или другой), объект ser. и так далее.
Чтобы замкнуть буферы, вызовите метод sock.redir и укажите буфер, в который нужно перенаправить данные. После этого событие on_sock_data_arrival вообще не будет генерироваться, потому что данные пойдут прямо в указанный буфер TX. Как только данные попадают в этот буфер, они автоматически фиксируются для отправки. Пример:
sub on_sys_init
sock.num=0
sock.redir(PL_REDIR_SOCK0) ' This is a loopback for socket 0.
end sub
Выигрыш в производительности огромен, и тому две причины: во-первых, данные не обрабатываются программно, так что виртуальная машина вообще не задействована. Во-вторых, принимаемые данные попадают прямо в буфер TX, из которого передаются, поэтому в памяти выполняется меньше копирования.
Конечно, с такими данными вы ничего сделать не можете - вы лишь прокачиваете их через устройство. Однако очень часто именно это и требуется! Кроме того, обрабатывать встроенные (inband) команды и ответы (сообщения) по-прежнему можно.
Чтобы остановить перенаправление, можно вызвать sock.redir(0), что означает «принимать данные в буфер RX сокета обычным образом».
Перенаправление и UDP
В разделе Использование буферов в режиме UDP объяснялось, что объект sock. сохраняет границы датаграмм UDP при хранении в буферах RX и TX. Для этого объект sock. использует специальные заголовки датаграмм, которые тоже хранятся в этих буферах. Значит, в буферах лежат не только данные, но и дополнительная «служебная» информация.
Если буфер RX «сокета UDP» (то есть сокета, работающего в режиме UDP) перенаправлен в буфер TX другого сокета UDP, границы датаграмм сохраняются. Принимающий сокет по-прежнему отправит данные, разделённые на исходные датаграммы.
Если буфер RX сокета UDP перенаправлен в буфер TX сокета TCP или последовательного порта, служебная информация удаляется, а границы датаграмм стираются. Для принимающего сокета TCP или последовательного порта данные выглядят как поток.
Перенаправление буферов не следует использовать на сокете, работающем в режиме TLS. Дело в том, что буферы TX и RX сокета в режиме TLS содержат только зашифрованные данные.