我需要编写一个可以接收不同消息片段的函数,然后将它们拼凑在一起。片段采用类msg
的形式,其中包含
int message_id
int no_of_fragments
int fragment_id
string msg_fragment
该功能需要执行以下操作
no_of_fragments == 1
,则消息未被分段,功能可以在此处停止no_of_fragments > 1
,则邮件会被分段
message_id
和fragment_id
message_id
= 111且no_of_fragments
= 6,系统应确保已收集fragments_id
1-6 这样做的最佳方式是什么?我认为地图可能很有用(message_id
用作关键字,指向容纳碎片的容器),但会欣赏任何建议。
谢谢!
答案 0 :(得分:1)
我会使用矢量图。每次收到新的邮件ID时,请将其用作地图密钥。然后根据收到的第一个片段中指定的片段数量分配一个向量来保存片段(不必按顺序)。你还需要保持计数,所以很容易知道你什么时候收到最后一个片段,所以可能是一个message_id映射到count结构和片段向量。
我的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将片段直接放入片段向量中的位置(因为它们是零索引的)。通过这种方式,无论顺序如何,您都可以按正确的顺序使用它们。
添加片段后,检查fragment_received ==片段是否符合预期,然后将它拼凑在一起处理数据。
这给出了恒定时间的第一片段检测和分配,恒定时间片段插入,恒定时间完成消息接收检测和线性时间消息重建(不能做得比这更好)。
此解决方案不需要特殊的外壳来处理非碎片数据。
一旦将片段重新组合成完整的信息,请不要忘记删除片段。