C++ IOCP 服务器容器信息

标签 c++ iocp

我一直在脑海中传递一些关于如何在保持 KISS 的同时使用 IO 类型的架构实际包含大量连接的想法。通过网络上的示例,似乎大多数人都使用带有 CONTAINING_RECORD 的双/单链表。而且,作为 IO 服务器的新手(尽管每天都在进步),我也将链表容器用于 IO 架构。

我的问题是,为什么我不能只构建一个大数组并使用 CONTAINING_RECORD,而不是为我的连接使用单/双链表?我可以使用 STL vector 吗?那行得通吗?此外,还有哪些其他类型的容器最适合大型 IO 服务器。

我正在为我的游戏服务器重写服务器架构(经过多次修改),这次我想朝着正确的方向前进,因为我不想在不久的将来再次重写它。

感谢您的宝贵时间和回复。

编辑:目前我的服务器架构是(简而言之):

Main thread listening and accepting -> Pass over the socket into a container.
Worker threads(2-3) grab IO events for the container of sockets.
Worker threads Read/Write Data on that container.

主线程和工作线程都使用链表。我想摆脱这个。

最佳答案

您的“连接列表”可能会从任何位置删除,而不仅仅是结尾。对于 std::vector,删除中间的元素是一个 O(N) 操作,但对于链表它可以是 O(1)。 (对于单链表,这不是微不足道的,可能需要一个不方便的 API)。

std::map 可能是一个有趣的选择,因为它提供 O(log N) 查找和删除元素。

关于C++ IOCP 服务器容器信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12364139/

相关文章:

C++变量声明和初始化规则

c++ - 一个简单的国际象棋 Minimax

c++ - IO 完成端口和套接字 send()

windows - 如何知道 CancelIo() 何时完成?

c++ - 阻塞模式下的 WSASend() 是否会导致将通知数据包放置在完成端口中?

c++ - main() 之前的堆栈溢出异常

c++ - 为 Intranet 主机创建 C++ 命名管道

c++ - for() 和 while() 之间有什么性能差异吗?

c++ - WSASend() 和 WSARecv() 的所有错误代码是否都意味着套接字已断开连接?

c - 没有完成键的 IOCP 通知