我有一个数据表,它用一个不断增加的索引(n++)发送数据。其中一些数据有可能无法正常发送、丢失或需要重新传送。
示例
。
似乎这种逻辑无处不在,我不想重新发明轮子,做一些效率不高的事情。
问题
我应该如何实现(或存在什么引用实现),以便跟踪按顺序接收到的数据,并可能在序列中包含丢失的数据?
(也感谢你协助标注这一问题)
发布于 2012-05-13 13:24:34
好吧,我是用链表做的。一定要有个事先的工作.不管是哪种方式,这都是针对一个输入序列进行优化的,该系列的性质或多或少在增加。
如果您看到任何bug,或者我可以做的增强,请告诉我。
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 });
}
}发布于 2012-05-12 16:39:53
您在OQ: TCP中提到了规范实现。所以通过TCP发送数据会带来一些可喜的后果,
无论何时(如果任何时候)数据不按顺序到达,您都可以安全地假设,您的发送或接收过程都是misbehaving.
我强烈建议您只使用TCP作为传输,并且(如果这不是可直接实现的)只需将TCP数据报封装到其他网络流中即可。
简而言之:使规范实现成为您的实现。
发布于 2012-05-12 19:53:39
首先,如果你有一个潜在的比赛条件,你应该修复它。
TCP通过等待克服了无序数据的问题.如果数据包6在数据包4之后到达,TCP将等到数据包5到达。如果数据包5在一段时间内没有到达,TCP将要求重新传输数据包5,这将导致数据包5的重新发送。
(注意-我知道TCP/IP计数字节,而不是数据包,这里不相关)
如果你可以要求你的‘哑巴嵌入式设备’重传,你可以使用同样的技术。我打赌你做不到,所以你需要另一种机制。它可以类似于TCP所做的事情。你只需要决定你要等多久,直到你决定一个条目丢失。
https://stackoverflow.com/questions/10565487
复制相似问题