【问题标题】:How to split data into equal size packets having variable header size..如何将数据拆分为具有可变标头大小的相等大小的数据包..
【发布时间】:2010-12-01 18:42:27
【问题描述】:

我正在 python 中构建点对点应用程序。它可以通过 UDP 工作。我有一个名为 getHeader(packetNo,totalPackets) 的函数,它返回该数据包的标头。根据标头的大小,我正在切割数据,将数据附加到标头并获得相同的数据包大小。

标题大小不是固定的,因为不同数字所消耗的长度不同,例如我正在将 packetNo=1 的标头写为 PACKET_NO=1 ,对于 packetNo 10、100 等,它的长度会有所不同

我目前没有在标头中包含任何数据包。我只包括数据包编号,我想包括它,但是在计算标头大小之前我怎么知道没有数据包,因为标头现在应该不包含数据包,并且 NO_OF_PACKETS=--- 可以是任何长度。

我可以通过一些函数传递它,该函数将计算数据包的数量,但这将类似于蛮力并且会消耗不必要的时间和处理能力。有什么聪明的方法可以做到吗?

【问题讨论】:

    标签: python sockets udp packets


    【解决方案1】:

    为什么不对数据包数量进行零填充,以使标头固定。假设你想在一条消息中支持 10 亿个数据包:

    PACKET_NO=0000000001
    

    长度相同:

    PACKET_NO=1000000000
    

    当然,这会为可能的数据包数量创建一个上限,但必须有一些上限,不是吗?

    【讨论】:

      【解决方案2】:

      不要使用纯文本。使数据包的标头成为两个打包的 4 字节(或 8 字节,取决于您期望的数据包数量)整数,例如

      import struct
      header = struct.pack('!II', packetNo, totalPackets)
      

      Here's documentation 用于 struct 模块。

      【讨论】:

      • 是的,64 位无符号整数会将数据包数量限制为 2^64,32 位限制为 2^32。如果您真的关心该限制,请使用更大的一个(例如,两个 64 位 uint 用于 packetNo,两个用于 totalPackets;这将为您提供 2^128 的限制)。
      • 您不需要超过 64 位的值。即使你每秒发送一百万个数据包,数据包数也需要超过一百万年才能环绕。到那时,我们都将死去很久,所以这将是别人的问题。猜猜他们将不得不重新启动连接;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      相关资源
      最近更新 更多