C++套接字服务器体系结构
C++ socket server architecture
我正在为我的实时游戏设计一个TCP套接字服务器,我有两种架构方法。他们在这里:
-
我们启动两个线程。一个侦听无限循环中的新连接,并将新客户端添加到数组中。第二个按顺序扫描阵列中的所有客户端套接字并从中读取数据。
我们启动一个线程,该线程在 无限循环中侦听新连接,然后为每个仅从一个套接字读取数据的客户端启动新线程。
我已经对大约 100 个客户端进行了一些测试,我看不到两种架构的性能差异。所以,我想问问你的意见,哪种方式更好。谢谢!
这一切都取决于您的游戏的实际实时性。
在第一种方法中,您正在所有打开的套接字上实现事件的多路复用 - 并且可能使用 select()
或 poll()
来阻止。显然,虽然您只能在阻止时接收事件的通知,但如果在取消阻止时传递了多个事件,则可以有效地序列化每个事件的处理。
在第二种方法中,您有可能并行处理事件(特别是在多处理器系统上),并且还可以使用线程优先级确定连接的优先级。 但是,此方法使用更多内存,并且计划线程比在第一种方法中迭代事件列表要昂贵得多。
您需要问自己的问题是:
- 您真的需要并行处理事件吗? (你是否打算在处理中序列化执行?
- 每个事件的处理量是否明显超过调度线程的成本?
- 线程堆栈的内存消耗是否会限制可伸缩性?
- 您的实时要求真的那么严格吗?
在我看来,这取决于你认为什么对你来说更容易。
你使用提升吗?如果是,您可以查看他们使用asio
实现此类服务器体系结构的示例。这样,您可以避免在侦听连接和处理请求时手动管理线程。
还有ZeroMQ,它是一个库,专门为轻松实现服务器架构而制作。有了它,您可以通过显式控制线程数等来测试更详细的情况。
希望这有帮助。
使用WebSocket,这里有一个快速提示:看看 https://github.com/zaphoyd/websocketpp 和/或问作者(Peter)。WebSocket++有一个非常灵活的框架,关于你做什么/如何做你的WebSocket处理。
根据经验,我会为新客户端提供一个单独的线程,以便您可以处理登录,并让它等待一个好点加入游戏。 我想你并不总是想为新玩家登录而中断游戏。 否则,一个主线程可能会变得非常混乱。
您可能还希望线程组中有多个现有游戏线程以实现可扩展性,例如,如果您有 8+ 个可用内核,则每个游戏一个。 甚至考虑从新游戏线程重定向到另一台服务器,以获得更大的可伸缩性。
只需使用Boost.Asio并快乐!学习一些示例并开始制作真正的游戏,而不是网络基础知识。
- vscode g++链路故障:体系结构x86_64的未定义符号
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- PCL 出错:体系结构x86_64 @pcl的未定义符号
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 体系结构x86_64的未定义符号:链接器错误
- C++ std::vector<int> 体系结构的未定义符号 x86_64:
- 未使用的 asm() 在不受支持的体系结构上的行为
- 用于本地网络运行的客户端服务器体系结构
- 生成文件:体系结构x86_64的未定义符号
- Xcode"体系结构x86_64的未定义符号"
- 有了memory_order_relaxed,原子变量的总修改顺序如何在典型体系结构上得到保证
- 体系结构x86_64的未定义符号:找不到原因
- 在OSx:ld上使用CMake构建C++项目:找不到体系结构x86_64的符号
- 体系结构x86_64的未定义符号:c++/ h 文件和 cpp 文件
- 以编程方式在运行时检测 CPU 体系结构
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- 了解类型特征的体系结构
- C++套接字服务器体系结构
- 具有进程间通信功能的服务器-客户端日志记录体系结构.你知道解决方案吗?