首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用来重建udp会话的结构是什么?

用来重建udp会话的结构是什么?
EN

Stack Overflow用户
提问于 2012-03-07 21:40:04
回答 4查看 722关注 0票数 0

我在执行股票交易引擎。我通过UDP接收代码,每个udp多播数据包都有序列号。Exchange一个接一个地发送数据包,但由于UDP没有获得订单,它们可能(也将)以轻巧的“混合”顺序接收,举个例子:

代码语言:javascript
复制
1 2 3 5 4 6 7 10 9 8 11 12 13 14 15

假设我按正确的顺序接收数据包,那么一切都会很容易--我可以使用Queue添加数据包并在以后对它们进行排线。但是由于数据包没有完全有序,我有几个问题:

  • 用来存储数据包的结构是什么?我需要队列和排队列的能力,我也需要在数组
  • 中任意位置添加数据包的能力,如果丢了一些数据包,我需要上升“恢复”过程。因此,每当"nextPacketSequenceNumber != currentPacketSequenceNumber + 1“时,我应该等待5 ms,如果不是这样的话,我应该会恢复。例如

1 2 3 5.5毫秒后..。4-好1 2 3 5.10毫秒后..。4-恢复1 2 3 5 6 7-恢复

EN

回答 4

Stack Overflow用户

发布于 2012-03-07 21:47:54

您可以使用priority queue来解决重新排序问题,序列号作为键(优先级)。最简单的优先级队列只是一个有序字典。恢复问题可以通过优先级队列和闹钟的组合来解决。

票数 0
EN

Stack Overflow用户

发布于 2012-03-07 21:48:55

这可能不是最有效的方法,但我过去使用过OrderedDictionary (尽管SortedDictionary可能更合适)来处理无序问题。使用序列号作为密钥,以数据包数据作为值。

不幸的是,我无法回答你的第二个问题(没有付出很大的努力)。我建议的唯一一件事是扩展您的协议,允许接收者发送一种可由接收方发送给发端者的回收信息,告诉他们重新发送数据包,因为原来的数据包被丢弃了。我有这样的逻辑(只是要复杂得多),虽然它是公司财产,所以我不能分享它。希望这能让你渡过难关。

票数 0
EN

Stack Overflow用户

发布于 2012-03-07 22:07:08

如果排序是关键的话,问题就会变得更复杂--例如,您可以使用优先级队列,但是您也不希望处理队列之外的任何东西,除非是序列中的下一个队列。因此,您可能希望实现一个优先级队列,该队列也基于序列阻塞。

在这种情况下,一旦找到丢失的数据包,您可能希望在一个单独的线程中启动恢复过程--没有必要等待--如果数据包到达,那么就可以忽略恢复结果。

这类似于音频流中的抖动缓冲以重新排序UDP数据包.http://en.wikipedia.org/wiki/Jitter#Jitter_buffers

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9609500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档