Структура распаковки запроса на чтение в реализации TFTP - PullRequest
0 голосов
/ 22 мая 2018

Что касается RFC TFTP, пакет RRQ / WRQ должен быть таким:

    2 bytes     string    1 byte     string   1 byte
    ------------------------------------------------
    | Opcode |  Filename  |   0  |    Mode    |   0 |
    ------------------------------------------------

Режим может быть "netascii", "octet" (эквивалент двоичного) или "mail".Дело в том, что netascii - это 8 букв, в октете - 5, а в почте - 4.

Я создаю свой пакет в моем клиенте следующим образом:

paq = struct.pack('!H'+str(len(fileName))+'sB'+str(len(mode))+'sB', 02, fileName, 0,mode, 0)

И затем я отправляю пакет всервер, так что сервер знает, чего ожидать (если RRQ или WRQ).

Дело в том, что я не знаю, как распаковать пакет, если я не знаю длины строк на стороне сервера... Я имею в виду, что единственным, кто знает длину файла и длину режима, является клиент, поскольку именно он создает пакет.

Мне нужна помощь в распаковке этого пакета на стороне сервера.Должен ли я отправлять длины на сервер перед отправкой пакета RRQ / WRQ, чтобы я знал формат, используемый при распаковке, или есть какой-либо другой способ?

Спасибо!

1 Ответ

0 голосов
/ 23 мая 2018

Если полученный пакет находится в байтовом массиве p, вы можете искать разделители 0 с помощью find().

opcode = p[0:2].decode('ASCII')
nameEnd = p.find(b'\0', start=2)
filename = p[2:nameEnd].decode('ASCII')
modeEnd = p.find(b'\0', start=nameEnd+1)
mode = p[nameEnd+1:modeEnd].decode('ASCII')
...