我正在编写一个客户端应用程序,通过UDP与服务器程序进行通信.客户端定期发出数据请求,并需要使用最新的服务器响应.请求消息有一个16位无符号计数器字段,由服务器回显,因此我可以将请求与服务器响应配对.
由于它是UDP,我必须处理服务器响应无序到达(或根本没有到达)的情况.天真地,这意味着保持到目前为止看到的最高消息计数器并丢弃任何具有较低数字的传入消息.但是,只要我们传递65535条消息并且计数器回零,那就会失败.是否有一种很好的方法来检测(例如,有合理的可能性)消息5实际上是在消息65,000之后?
实现语言是C++.
处理此问题的常用方法是进行模减法.序列号a
在序列号之后,b
当且仅当(a - b) % 65536
大于(b - a) % 65536
.
对于您的示例,(65000 - 5) % 65536
是64995并且(5 - 65000) % 65536
是541,因此序列号5在序列号65000之后.