Python / Twisted - TCP数据包碎片?

时间:2009-01-20 04:38:17

标签: python tcp twisted packet

在实现dataReceived方法时在Twisted中,似乎没有任何引用被分段的数据包的示例。在其他所有语言中,这是你手动实现的东西,所以我只是想知道这是否已经为你做了扭曲或者什么?如果是这样,我是否需要在数据包前加上长度标题?或者我必须手动执行此操作吗?如果是这样,那会是什么方式?

3 个答案:

答案 0 :(得分:6)

在dataReceived方法中,您将数据作为一个不确定长度的字符串返回,这意味着它可能是您协议中的整个消息,或者它可能只是某个“客户”发送给您的消息的一部分。您必须检查数据以查看它是否包含协议中的完整消息。

我目前正在我的一个项目中使用Twisted来实现协议,并决定使用struct模块打包/解压缩我的数据。我正在实现的协议具有固定的头大小,所以在我读取至少HEADER_SIZE字节数之前,我不构造任何消息。总消息大小在此标头数据部分中声明。

我猜你真的不需要将消息长度定义为协议的一部分,但它有所帮助。如果您没有定义一个,则必须有一个特殊的分隔符来确定消息的开始/结束时间。排序FIX协议如何使用SOH字节来分隔字段。虽然它确实有一个必填字段,告诉你消息有多长(而不是消息中有多少字段)。

答案 1 :(得分:6)

在处理TCP时,你应该忘记所有'数据包'的概念。 TCP是一种流协议 - 您将数据流传输到另一端的数据流。一旦数据被发送,只要数据全部以正确的顺序到达,就允许它根据需要到达尽可能多的块。您必须像使用其他语言一样手动进行分隔,使用长度字段,消息类型字段或特殊分隔符等。

答案 2 :(得分:2)

您还可以使用LineReceiver协议