结构在TFTP实现中解压缩读取请求

时间:2018-05-22 20:53:32

标签: python sockets struct unpack tftp

关于TFTP的RFC,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 :(得分:0)

如果收到的数据包在字节数组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')