Выделение памяти под буферы
У каждого буфера есть размер, то есть объём памяти. Эта память выделяется по запросу вашей программы. При первой загрузке устройства под буферы не выделено вообще никакой памяти.
Память под буферы выделяется страницами. Страница - это 256 байт памяти. Выделение памяти под буфер происходит в два шага: сначала нужно запросить конкретный объём (число страниц), а затем выполнить само выделение.
Чтобы объект sock. мог отправлять и принимать данные, нужно выделить память его буферам TX и RX. Это делается методами sock.txbuffrq и sock.rxbuffrq.
Метод выделения (sys.buffalloc) применяется сразу ко всем ранее заданным буферам, одним махом.
Таким образом:
dim in, out as byte
out = sock.txbuffrq(10) ' Requesting 10 pages for the TX buffer. Out will then contain how many can actually be allocated.
in = sock.rxbuffrq(7) ' Requesting 7 pages for the RX buffer. Will return number of pages which can actually be allocated.
' ... Allocation requests for other buffers...
sys.buffalloc ' Performs actual memory allocation, as per previous requests.
Само выделение памяти занимает до 100 мс, поэтому его обычно выполняют один раз при загрузке, сразу для всех нужных буферов. Если какой-то буфер не нужен, память под него можно не выделять - тогда он фактически отключён.
Полный запрошенный объём памяти получить удаётся не всегда. Память не бесконечна: если вы уже запросили (и получили) 95% памяти платформы, то следующий запрос получит не больше оставшихся 5%, даже если вы просили 10%.
У каждого буфера есть небольшие накладные расходы, то есть не вся выделенная буферу память доступна для данных. Часть байтов в каждом буфере зарезервирована под переменные, необходимые для управления этим буфером. Таких байтов 17 для 16-разрядных платформ и 33 для 32-разрядных. Тип платформы указан в документации по платформе.
Так, если мы запросили (и получили) буфер из 2 страниц (256 * 2 = 512 байт), то хранить в нём можно только 512 - 16 или 512 - 32 байт, в зависимости от типа платформы.
Если вы изменяете размер любого буфера сокета с помощью sys.buffalloc, а сам сокет не закрыт (sock.statesimple <> PL_SSTS_CLOSED), сокет будет закрыт автоматически. Текущее соединение будет сброшено. Если размеры буферов остаются прежними, сокет не закрывается.