binkp's frames: +---------------------- 0=data block, 1=message(command) | +---- data block size / msg's argument size | | 7 6543210 76543210 +-+-------+--------+--- ..... ---+ | | HI LO | | -- data block / msg's argument +-+-------+--------+--- ..... ---+ |<- 2 bytes ->|<- 32K max ->|Заголовок кадра -- два байта, определяющие тип и длину (в байтах) данных, следующих за заголовком. Если старший бит заголовка сброшен, то все данные поступившие с кадром следует дописать к текущему принимаемому файлу. (Если такой файл уже открыт, иначе -- отбросить) В противном случае, данные следует разобрать как команду, меняющую состояние протокола. Первый байт данных, поступивших с кадром -- номер команды. Оставшиеся -- аргумент. Аргументы команд -- произвольный набор символов, не обязательно ограниченный '\0'. Команда без аругментов (например, M_OK) может выглядеть примерно так:
7 6543210 76543210 76543210 +-+-------+--------+--------+ |1| 0 1| 4| +-+-------+--------+--------+ | | +----- номер команды (аргументов нет) | +-------- длина кадра без заголовка -- 1 байт +- это командаКоманды, которые понимает binkd/0.8, и их аргументы:
Аргумент команды игнорируется (и, возможно, записывается в лог). Именно так передаем нодлистовую информацию, имя сисопа и т.д.
eg, "ZYZ Dima Maloff"
Список 5D адесов (через пробел)
eg, "2:5047/13@fidonet 2:5047/0@fidonet"
Пароль. После успешной обработки пароля, принятого от remote, binkd-сервер пересканирует очередь.
eg, "pAsSwOrD"
Ответ на правильный пароль. binkd-клиент при приеме этого сообщения пересканирует очередь. Аргумент команды игнорируется.
eg, ""
Данные о следующем файле. Через пробел: имя файла (без пробельных символов); размер; unix-time; смещение, с которого файл передается. Все -- в десятичной системе. Все следующие принятные блоки данных относятся именно к этому файлу до поступления следующего сообщения M_FILE. Специального признака конца файла нет, так как размер файла известен заранее. binkd "лишние" блоки допишет к концу текущего файла. Каждый новый файл мы начинаем передавать со смещения 0. Получение M_GET от remote должно заставить нас сделать seek.
eg, "config.sys 125 2476327846 0"
Или, при ответе на M_GET со смещения 100:
"config.sys 125 2476327846 100"
End-of-Batch. EOB передается после того, как посланы все файлы. Если мы находимся в сосотоянии EOB (все файлы посланы), получаем от remote EOB (больше нет файлов для нас), мы получили все подтверждения на все посланные файлы, мы получили все файлы перезапрошенные по GET, то сессия считается успешно завершенной.
eg, ""
Передается принимавшей файл системой как подтверждение после получения последней порции данных файла. Аргументы копируют аргументы команды FILE от remote, за исключением последнего -- смещения, который не возвращается на систему, передавшую M_FILE. GOT может быть передан и в процессе приема файла -- реакция на нее передающей стороны -- разрушающий skip.
eg, "config.sys 125 2476327846"
Фатальная ошибка. Сторона, передавшая M_ERR, завершает сессию. ргумент, текст объясняющий причину, пишется в лог. binkd передает M_ERR в ответ на неверный пароль.
eg, "Incorrect password"
Передается если наша система занята. Аргумент игнорируется принимающей стороной. (Записывается в лог)
eg, "Too many servers are running already"
С помощью M_GET делается resend. Аргументы M_GET копируют аргументы команды M_FILE, которую мы бы желали видеть от remote. :) Binkd посылает ее как ответ на M_FILE в том случае, если его не устраивает смещение с которого нам начали файл передавать.
eg, "config.sys 125 2476327846 100"
Сейчас binkd обрабатывает ее так: по первым полям (имя/размер/unixtime) определяет, является ли аргумент M_GET текущим для нас передаваемым файлом (либо файл уже передан и мы ждем для него M_GOT), и если это так, делает seek на заданное смещение, после чего послылает M_FILE. Для нашего примера M_FILE будет иметь аргументы:
"config.sys 125 2476327846 100"
Неразрушающий skip. Пример строки пареметров:
"config.sys 125 2476327846"
вызвающая система посылает | вызываемая система посылает |
---|---|
M_NUL "SYS ..." | M_NUL "SYS ..." |
M_NUL "ZYZ ..." | M_NUL "ZYZ ..." |
M_NUL "LOC ..." | M_NUL "LOC ..." |
M_NUL "VER ..." | M_NUL "VER ..." |
M_ADR "2:2/2.2@fidonet" | M_ADR "3:3/3.3@fidonet" |
M_PWD "password" | (ждем пароля от remote) |
M_OK "" или M_ERR "Bad password" | |
(ждем M_OK) | M_FILE "file2 200 42342434 0" |
M_FILE "file1 100 423424244 0" | data |
data | data |
data | data |
M_EOB | (получили file1 целиком, подтверждаем) |
(получили file2 целиком, подтверждаем) | M_GOT "file1 100 423424244" |
M_GOT "file2 200 42342434" | data |
M_EOB |