C ++套接字服务器架构

时间:2012-08-14 10:54:33

标签: c++ sockets unix websocket serversocket

我正在为我的实时游戏设计TCP套接字服务器,我已经采用了两种方法来构建它。他们在这里:

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

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

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

5 个答案:

答案 0 :(得分:3)

这完全取决于你的游戏实时的实际情况。

在第一种方法中,您正在所有打开的套接字上实现事件的多路分解 - 并且可能使用select()poll()来阻止。显然,虽然您只能在被阻止的情况下收到事件通知,但如果在解除阻止时发送了多个事件,您可以有效地序列化每个事件的处理。

在第二种方法中,您有可能并行处理事件(特别是在多处理器系统上),并且还可以使用线程优先级对连接进行优先级排序。但是,这种方法使用更多内存,而调度线程比在第一种方法中迭代事件列表要昂贵得多。

您需要问自己的问题是:

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

答案 1 :(得分:2)

在我看来,这取决于你认为对你更容易的事情。

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

还有ZeroMQ,它是一个库,专门用于轻松实现服务器体系结构。有了它,您可以通过显式控制线程数等来测试更详细的案例。

希望这有帮助。

答案 2 :(得分:2)

如果你想去WebSocket,这里有一个快速提示:查看https://github.com/zaphoyd/websocketpp和/或询问作者(Peter)。 WebSocket ++有一个非常灵活的框架,关于你进行WebSocket处理的内容和方式。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

只需使用Boost.Asio即可开心!学习一些例子并开始制作实际游戏,而不是网络基础。