C++套接字服务器架构

4
我正在设计一个实时游戏的TCP套接字服务器,并思考两种不同的架构方法。这里是它们:
1. 我们启动两个线程。其中一个无限循环监听新连接并将新客户端添加到数组中。第二个顺序扫描来自数组的所有客户端套接字并从中读取数据。
2. 我们启动一个线程,无限循环监听新连接,然后为每个客户端启动一个新的线程,仅从一个套接字读取数据。
我进行了大约100个客户端的测试,但无法看出两种架构在性能方面的区别。因此,我想请你的建议,哪一种方式更好?谢谢!

2
从http://www.kegel.com/c10k.html开始。 - Maxim Egorushkin
5个回答

4
这完全取决于你的游戏有多实时。在第一种方法中,你正在实现所有打开的套接字上事件的分离 - 并且可能使用select()或poll()来阻塞。显然,只有在阻塞时才能收到事件通知,并且如果在解除阻塞时传递了多个事件,则会有效地串行化处理每个事件。在第二种方法中,你有机会并行处理事件(尤其是在多处理器系统上),并且可以使用线程优先级来设置连接的优先级。但是,这种方法使用更多内存,并且调度线程比在第一种方法中迭代事件列表要昂贵得多。你需要问自己的问题是:你是否真的需要并行处理事件? (你是否无论如何都会在处理过程中序列执行?)每个事件的处理量是否明显高于调度线程的成本?线程堆栈的内存消耗是否限制了可伸缩性?你的实时要求真的那么严格吗?

2
在我看来,这取决于你认为哪种方式更容易。
你使用boost吗?如果是的话,你可以查看他们使用asio实现此类服务器架构的示例。这样,当监听连接和处理请求时,你就可以避免手动管理线程。
另外,还有一个专门用于轻松实现服务器架构的库ZeroMQ。使用它,你甚至可以通过明确控制线程数量等来测试更详细的情况。
希望这能帮到你。

2
如果你想使用WebSocket,这里有一个快速提示:看一下https://github.com/zaphoyd/websocketpp,或者问问作者(Peter)。WebSocket++提供了非常灵活的框架,可以处理WebSocket的内容和方式。

1

根据经验,我建议为新客户端创建一个单独的线程,以便您可以处理登录,并等待加入游戏的良好时机。我想象您并不总是希望因为新玩家登录而打断游戏。否则,一个主线程可能会变得非常混乱。

您还可以为可扩展性创建多个现有游戏线程组,例如每个游戏一个线程,如果您有8个以上的核心。甚至考虑从新游戏线程重定向到另一个服务器,以实现更大的可扩展性。


0

只需使用Boost.Asio,你就会感到快乐!学习一些例子,开始制作实际的游戏而不是网络基础。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接