管理多个UDP套接字的超时
Manage timeouts for multiple UDP sockets
我必须为一门大学课程在Windows和Linux上编写一个TFTP (Trivial File Transfer Protocol)服务器。我正在使用c++,我想使用一个线程和select()来检查新的传入数据包。TFTP要求,如果数据包在一定时间内没有得到确认,则重新发送数据包。我想知道管理这些多个超时的最佳方法是什么。
我正在考虑创建一个std::列表,其中包含将连接与超时发生的绝对时间相关联的对象。列表通过增加超时时间来排序(所有超时在分配时都是相同的,所以新的超时总是最大的,可以到列表的末尾-否则我将需要一个映射而不是列表)。
由于我需要重置连接的超时,如果数据包及时到达,我想创建一个std::map,将连接与指向其在列表中的位置的迭代器关联起来。当一个连接的超时更新时,可以快速找到列表中的元素,更新并移动到列表的末尾(再次假设新的超时是最大的)。
如果我理解正确的话,您有对连接/超时,并且您希望能够通过连接和超时访问这些对。通过连接,因为您必须在收到数据包时更改超时,通过超时,因为您需要知道下一个超时连接是什么。
如果您不反对boost,请查看multi_index。
如果你想滚动你自己的指针,你可以保留两组指针,给这两组指针不同的比较函数:
class Connection {
...
public:
int GetTimeout() const;
int GetID() const;
};
class TimeIsLess {
public:
bool operator()(const Connection*c1, const Connection*c2) const {
return c1->GetTimeout() < c2->GetTimeout();
}
}
class IdIsLess {
public:
bool operator()(const Connection*c1, const Connection*c2) const {
return c1->GetId() < c2->GetId();
}
}
std::set<Connection*,TimeIsLess> connectionsByTime;
std::set<Connection*,IdIsLess> connectionsById;
创建连接:
...
Connection * c = new Connection(id, timeout);
connectionsByTime.insert(c);
connectionsById.insert(c);
...
要获取下一个将超时的连接,只需获取第一个连接:
auto nextToTimeout = connectionsByTime.begin();
if (nextToTimeout != connectionsByTime.end())
{
if ( (*nextToTimeout)->GetTimeout() < now )
{
// Close the connection
}
}
要删除连接,必须从一个集合中移除指针,并从另一个集合中移除和删除指针。
这些都不是我编译的,所以不要指责我的错别字(:
相关文章:
- 为什么我在蓝牙连接()上收到"java.io.IOException:读取失败,套接字可能关闭或超时,读取re
- UDP 套接字 select() 在某些情况下无延迟(超时)返回 1
- Linux 套接字 recv 返回 -1,errno 110 连接超时
- 为什么 Windows udp 接收套接字上的超时总是比 SO_RCVTIMEO 设置的长 500 毫秒
- 如何设置超时以在C套接字上"connect()"功能?
- 如何通过超时检查Boost ASIO套接字中的数据
- c tcp套接字非阻塞接收超时
- C++中的Bittorrent客户端,在非阻塞套接字上连接到对等端总是超时
- 多线程套接字超时
- 客户端套接字连接() 在服务器 accept() 超时后成功
- 正在设置套接字超时
- 套接字SO_RCVTIMEO超时是C++/VC++中设置值的两倍
- 如何在Unix上的c++套接字上使用带有read()的超时
- 套接字连接超时因网络而异
- 管理多个UDP套接字的超时
- 在Windows上设置来自套接字的recv超时
- Boost ASIO套接字读取N字节不多不少,等待它们到来或超时异常
- 带超时的多线程面向对象套接字代码
- 正在获取套接字函数的连接超时
- 从一组套接字中检测超时套接字