【发布时间】:2011-11-23 22:05:51
【问题描述】:
我必须在 Windows 和 Linux 上为大学课程编写 TFTP(普通文件传输协议)服务器。我正在使用 C++,我想使用一个线程和 select() 来检查新的传入数据包。 TFTP 要求如果数据包在一定时间内没有被确认,则重新发送数据包。我想知道管理这些多次超时的最佳方法是什么。
我正在考虑创建一个 std::list,其中包含将连接与发生超时的绝对时间相关联的对象。该列表通过增加超时时间来排序(所有超时在分配时都是相同的,因此新的超时始终是最大的,并且可以到列表的末尾 - 否则我需要一个映射而不是列表)。 由于我需要重置连接的超时,如果数据包及时到达,我想创建一个 std::map ,将连接与指向其在列表中的位置的迭代器相关联。当连接的超时更新时,列表中的元素可以快速找到、更新并移动到列表的末尾(再次假设新的超时是最大的)。
这是解决问题的好方法还是有更简单的方法?
【问题讨论】:
-
请注意不要让迭代器指向您要修改的列表。在这种情况下,将一个项目移动到列表的末尾将使地图持有的迭代器无效。
-
谢谢你们的帮助。实际上只有被移动项目的迭代器是无效的。其他的仍然有效。见http://www.sgi.com/tech/stl/List.html。但我将使用这个版本,我将项目保存在一个集合中,就像你建议的那样,而不是一个列表(见下面我的评论)。