0

我需要编写一个可以接收不同消息片段的函数,然后将它们拼凑在一起。片段是一个类的形式msg,它保存着

int message_id
int no_of_fragments
int fragment_id
string msg_fragment

该功能需要做以下

  1. 检查收到no_of_fragments == 1的消息 - 如果那时消息没有被分段并且功能可以在这里停止
  2. 如果no_of_fragments > 1那么消息是碎片化的
    • 得到message_idfragment_id
    • 收集所有片段,例如对于message_id=111 和no_of_fragments=6,系统应确保fragments_id已收集 1-6
    • 将碎片拼凑在一起

这样做的最佳方法是什么?我认为地图可能有用(以message_id作为键,指向将容纳片段的容器),但会感谢任何建议。

谢谢!

4

1 回答 1

1

我会使用向量图。每次收到新消息 ID 时,都将其用作映射键。然后根据收到的第一个片段中指定的片段数分配一个向量来保存片段(不必按顺序排列)。您还需要保存计数,因此很容易知道您何时收到最后一个片段,因此可能是 message_id 到计数结构和片段向量的映射。

我的 C++ 生锈了:

struct message_parts {
  int fragments_expected; // init to no_of_fragments
  int fragments_received; // init to 0 (you'll bump it as soon as you add the fragment to the vector)
  vector<fragment *> fragments; <-- initialize size to no_of_fragments 
}

std::map<int, message_parts> partial_messages

插入片段时,将其直接放入基于 fragment_id - 1 的片段向量中的位置(因为它们是零索引的)。这样,无论它们进入的顺序如何,您都将始终以正确的顺序排列它们。

添加片段后,检查是否 Fragments_received == 预期的片段,然后您可以将其拼凑并处理数据。

这给出了恒定时间第一片段检测和分配、恒定时间片段插入、恒定时间完整消息接收检测和线性时间消息重构(没有比这更好的了)。

该解决方案不需要对非分段数据进行特殊封装。

将片段重新组合成完整的消息后,不要忘记删除它们。

于 2013-06-11T02:30:04.133 回答