在 TFTP 实现中解包读取请求的结构

Struct unpacking a Read Request in TFTP implementation

关于 TFTP(简单文件传输协议)的 RFC,RRQ/WRQ(Read\write 请求)数据包具有以下格式:

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

模式可以是“netascii”、“八位字节”(相当于二进制)或“邮件”。事情是 netascii 是 8 个字母,八位字节有 5 个,邮件有 4 个。

我在我的客户端中创建我的数据包是这样的:

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

然后我将数据包发送到服务器,这样服务器就知道会发生什么(在 RRQ 情况下读取,否则写入)。

问题是,如果我不知道服务器端的字符串长度,我不知道如何解压数据包...只有客户端知道文件长度和模式长度,因为他使数据包。

我应该在 RRQ/WRQ 数据包之前将长度发送到服务器,以便我知道解包时使用的格式吗?还有别的办法吗?

谢谢!

如果收到的数据包在字节数组p中,可以用find().

搜索0分隔符
opcode = p[0:2].decode('ASCII')
nameEnd = p.find(b'[=10=]', start=2)
filename = p[2:nameEnd].decode('ASCII')
modeEnd = p.find(b'[=10=]', start=nameEnd+1)
mode = p[nameEnd+1:modeEnd].decode('ASCII')