gpt4 book ai didi

c++ - 在 C++ 中创建一个简单的数据包路由器,如何跟踪 'clients'?

转载 作者:行者123 更新时间:2023-11-28 04:03:12 24 4
gpt4 key购买 nike

我需要一个类 Router 来接收 IP 数据包,解析它们并发送给客户端(来自类 Client)。当然,每个 Client 都必须告诉 Router 他们想要接收特定端口的数据包。

template <class T>
class Router
{
public:
//Packets arrive from the world to a Client
virtual bool onReceivePacket(Packet<T>::Ptr packet);
//Packets arrive from a Client to the world
virtual void onSendPacket(Packet<T>::Ptr packet);
protected:
std::unordered_map<int, std::shared_ptr<Client>> tcpRoutingTable;
std::unordered_map<int, std::shared_ptr<Client>> udpRoutingTable;
}

Router 的接口(interface)非常简单。有人会用来自世界的数据包调用 onReceivePacket 并且 Router 将提取数据包的目标端口,如果它是 TCP 或 UDP,它将简单地路由到相应的客户端在客户端调用 onReceive。示例:

auto client = tcpRoutingTable.at(packet->tcpDestination());
client->onReceive(packet);

但是有两件事困扰着我:

1) 如何保持RouterClient 之间的关系?如果我简单地创建一个 Client 并将其订阅到 Router,那么 Router 还必须在 Client 中包含一个指向自身的指针。这种关系非常脆弱,就好像 ClientRouter 消失一样,它会以未定义的行为结束。此外,通过简单地在 ClientRouter 上使用 shared_ptr,我们得到了 shared_ptr 的递归问题,其中包括彼此,因此永远不会离开。

2) unordered_map 是路由数据包的最佳方式吗?我认为没有比简单地检查整数并发送到特定客户端更快的方法了。然而,第一个问题的答案可能会改变这个模型。

如你所见,Router 是单线程的,因为用来自世界的数据包调用Router 的东西也是单线程的。但是我可以从多线程中受益吗?

最佳答案

考虑到您更了解您的设计目标和限制 - 您强调简单性,以下是技术答案。

  1. std::weak_ptr 可用于打破由 std::shared_ptr 管理的对象形成的引用循环。

std::weak_ptr

由于您正在考虑并发性,因此请记住以下几点:直接实现 weak_ptr(Boost 库)的前身说 weak_ptr 提供了非常有限的操作子集,因为访问其存储的指针在多线程程序中通常很危险.您的 std 实现可能会继承同样的困难 - 请调查或在单独的问题中提问。

  1. 在内部,unordered_map 中的元素根据它们的哈希值被组织到桶中,以允许通过它们的键值直接快速访问单个元素(平均恒定的平均时间复杂度)。因此,从性能角度来看,使用 unordered_map 是有吸引力的。

关于c++ - 在 C++ 中创建一个简单的数据包路由器,如何跟踪 'clients'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59166983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com