
binkp работает через двунаправленный символьный канал, не допускающий
ошибок при передаче даннных. Любые данные, записываемые каждой из сторон
в канал, имеют следующий общий формат:

   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, и их аргументы:

M_NUL  0
  Аргумент команды игнорируется (и, возможно, записывается в лог). Именно
  так передаем нодлистовую информацию, имя сисопа и т.д.

  eg, "ZYZ Dima Maloff"

M_ADR  1
  Список 5D адесов (через пробел)

  eg, "2:5047/13@fidonet 2:5047/0@fidonet"

M_PWD  2
  Пароль. После успешной обработки пароля, принятого от remote,
  binkd-сервер пересканирует очередь.

  eg, "pAsSwOrD"

M_OK   4
  Ответ на правильный пароль. binkd-клиент при приеме этого сообщения
  пересканирует очередь. Аргумент команды игнорируется.

  eg, ""

M_FILE 3
  Данные о следующем файле. Через пробел: имя файла (без пробельных
  символов); размер; unix-time; смещение, с которого файл передается.
  Все -- в десятичной системе. Все следующие принятные блоки данных
  относятся именно к этому файлу до поступления следующего сообщения M_FILE.
  Специального признака конца файла нет, так как размер файла известен
  заранее. binkd "лишние" блоки допишет к концу текущего файла.
  Каждый новый файл мы начинаем передавать со смещения 0. Получение
  M_GET от remote должно заставить нас сделать seek.

  eg, "config.sys 125 2476327846 0"

  Или, при ответе на M_GET со смещения 100:

      "config.sys 125 2476327846 100"

M_EOB  5
  End-of-Batch. EOB передается после того, как посланы все файлы.
  Если мы находимся в сосотоянии EOB (все файлы посланы), получаем от
  remote EOB (больше нет файлов для нас), мы получили все подтверждения
  на все посланные файлы, мы получили все файлы перезапрошенные по GET,
  то сессия считается успешно завершенной.

   eg, ""

M_GOT  6
  Передается принимавшей файл системой как подтверждение
  после получения последней порции данных файла. Аргументы
  копируют аргументы команды FILE от remote, за исключением последнего --
  смещения, который не возвращается на систему, передавшую M_FILE.
  GOT может быть передан и в процессе приема файла -- реакция на нее
  передающей стороны -- разрушающий skip.

  eg, "config.sys 125 2476327846"


M_ERR  7
  Фатальная ошибка. Сторона, передавшая M_ERR, завершает сессию.
  ргумент, текст объясняющий причину, пишется в лог. binkd передает
  M_ERR в ответ на неверный пароль.

  eg, "Incorrect password"

M_BSY  8
  Передается если наша система занята. Аргумент игнорируется принимающей
  стороной. (Записывается в лог)

  eg, "Too many servers are running already"

M_GET  9
  Сейчас с помощью 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"

M_SKIP 10

  Неразрушающий skip. binkd его понимает, но никогда не посылает.
  Пример строки пареметров:

      "config.sys 125 2476327846"



Типичная сессия между двумя binkd:

      вызвающая система               вызываемая система
      посылает:                       посылает:

      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



(c) Copyright 1996-97 by Dima Maloff
Id: binkp.html,v 1.5 1998/10/08 07:31:48 maloff Exp
