我有一个数据流向我发送具有不断增加的索引 (n++) 的数据。其中一些数据可能会乱序发送、丢失或需要重新传输。
例子
假设我有一个由我的应用程序监控的安全日志文件。坏人可能会抑制或阻止一些条目的传输。我想警惕这个事实。
还假设此数据可能会乱序发送到日志记录器。
似乎这种逻辑无处不在,我不想重新发明轮子并做一些效率不高的事情。
问题
我应该如何实现(或存在哪些参考实现)以允许我跟踪乱序接收的数据并可能包含序列中的缺失数据?
(也感谢您在标记此问题方面的帮助)
我有一个数据流向我发送具有不断增加的索引 (n++) 的数据。其中一些数据可能会乱序发送、丢失或需要重新传输。
例子
假设我有一个由我的应用程序监控的安全日志文件。坏人可能会抑制或阻止一些条目的传输。我想警惕这个事实。
还假设此数据可能会乱序发送到日志记录器。
似乎这种逻辑无处不在,我不想重新发明轮子并做一些效率不高的事情。
问题
我应该如何实现(或存在哪些参考实现)以允许我跟踪乱序接收的数据并可能包含序列中的缺失数据?
(也感谢您在标记此问题方面的帮助)
好的,我使用链表做到了这一点。必须在某个地方为此进行先前的工作……无论哪种方式,这都针对本质上或多或少增加的输入序列进行了优化。
如果您发现任何错误或我可以进行的改进,请告诉我
public class ContiguousDataValue
{
public int UpperInt { get; set; }
public int LowerInt { get; set; }
public override string ToString()
{
return "Upper" + UpperInt + " Lower" + LowerInt;
}
}
public class ContiguousData
{
LinkedList<ContiguousDataValue> ranges = new LinkedList<ContiguousDataValue>();
public void AddValue(int val)
{
for (LinkedListNode<ContiguousDataValue> range = ranges.Last; range != null; range = range.Previous)
{
if (val > range.Value.UpperInt)
{
// increment current node if applicable
if (val == range.Value.UpperInt + 1)
range.Value.UpperInt = val;
else
ranges.AddAfter(range, new ContiguousDataValue() { UpperInt = val, LowerInt = val });
return;
}
else if (val < range.Value.LowerInt)
{
if (val == range.Value.LowerInt - 1)
{
range.Value.LowerInt = val;
return;
}
else
{
continue;
}
}
}
// Anything that reaches this line is either a very new low value, or the first entry
ranges.AddLast(new ContiguousDataValue() { UpperInt = val, LowerInt = val });
}
}
首先,如果你有潜在的竞争条件,你应该修复它。
TCP通过等待克服了数据乱序的问题。如果数据包 6 在数据包 4 之后到达,TCP 将一直等到数据包 5 到达。如果数据包 5 在一段时间内没有到达,TCP 将要求重新传输数据包 5,这将导致数据包 5 被重新发送。
(注意 - 我知道 TCP/IP 计算字节而不是数据包,这在这里无关紧要)
如果您可以要求您的“哑嵌入式设备”重新传输,您可以使用相同的技术。我打赌你不能这样做,所以你需要求助于另一种机制。它可以类似于 TCP 所做的。您只需要决定要等多长时间,直到您决定缺少一个条目。
您在 OQ 中提到了规范实现:TCP。所以通过 TCP 发送数据有一些受欢迎的结果,
我强烈建议简单地使用 TCP 作为您的传输,并且(如果这不是直接可行的)简单地将 TCP 数据报封装到您的其他网络流中。
简而言之:使规范实现成为您的实现。