代码之家  ›  专栏  ›  技术社区  ›  xBurnsed

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

  •  0
  • xBurnsed  · 技术社区  · 7 年前

    关于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 回复  |  直到 7 年前
        1
  •  0
  •   Barmar    7 年前

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