C++套接字服务器体系结构

C++ socket server architecture

本文关键字:体系结构 服务器 套接字 C++      更新时间:2023-10-16

我正在为我的实时游戏设计一个TCP套接字服务器,我有两种架构方法。他们在这里:

  1. 我们启动两个线程。一个侦听无限循环中的新连接,并将新客户端添加到数组中。第二个按顺序扫描阵列中的所有客户端套接字并从中读取数据。

  2. 我们启动一个线程,该线程在
  3. 无限循环中侦听新连接,然后为每个仅从一个套接字读取数据的客户端启动新线程。

我已经对大约 100 个客户端进行了一些测试,我看不到两种架构的性能差异。所以,我想问问你的意见,哪种方式更好。谢谢!

这一切都取决于您的游戏的实际实时性。

在第一种方法中,您正在所有打开的套接字上实现事件的多路复用 - 并且可能使用 select()poll() 来阻止。显然,虽然您只能在阻止时接收事件的通知,但如果在取消阻止时传递了多个事件,则可以有效地序列化每个事件的处理。

在第二种方法中,您有可能并行处理事件(特别是在多处理器系统上),并且还可以使用线程优先级确定连接的优先级。 但是,此方法使用更多内存,并且计划线程比在第一种方法中迭代事件列表要昂贵得多。

您需要问自己的问题是:

  • 您真的需要并行处理事件吗? (你是否打算在处理中序列化执行?
  • 每个事件的处理量是否明显超过调度线程的成本?
  • 线程堆栈的内存消耗是否会限制可伸缩性?
  • 您的实时要求真的那么严格吗?

在我看来,这取决于你认为什么对你来说更容易。

你使用提升吗?如果是,您可以查看他们使用asio实现此类服务器体系结构的示例。这样,您可以避免在侦听连接和处理请求时手动管理线程。

还有ZeroMQ,它是一个库,专门为轻松实现服务器架构而制作。有了它,您可以通过显式控制线程数等来测试更详细的情况。

希望这有帮助。

如果你想

使用WebSocket,这里有一个快速提示:看看 https://github.com/zaphoyd/websocketpp 和/或问作者(Peter)。WebSocket++有一个非常灵活的框架,关于你做什么/如何做你的WebSocket处理。

根据经验,我会为新客户端提供一个单独的线程,以便您可以处理登录,并让它等待一个好点加入游戏。 我想你并不总是想为新玩家登录而中断游戏。 否则,一个主线程可能会变得非常混乱。

您可能还希望线程组中有多个现有游戏线程以实现可扩展性,例如,如果您有 8+ 个可用内核,则每个游戏一个。 甚至考虑从新游戏线程重定向到另一台服务器,以获得更大的可伸缩性。

只需使用Boost.Asio并快乐!学习一些示例并开始制作真正的游戏,而不是网络基础知识。