为游戏(和其他任务)提供简单而有效的UDP服务器策略
Strategy for simple yet effective UDP server for gaming (and other tasks)
我正试图实现我的想法,简单但非常有效的多线程服务器工作在UDP。主要目标是用于游戏(类)应用程序,但如果它也能用于其他目的就更好了。
我想使用这个API/技术等
- STD::多线程线程,因为它是c++标准的一部分,它应该是面向未来的,就我所见,它既简单又能很好地与c++一起工作。
- BSDSock (Linux) &WinSock2 (Windows)。我将创建一个名为Socket的抽象类,并为每个平台(Linux - BSD, Windows - WinSock)创建实现本机API的派生类。然后我会使用基类Socket提供的API,而不是本机/平台API。这将允许我使用一个代码为整个服务器/客户端模块,如果我想改变平台,我必须只是切换类类型的套接字,这就是它。
对于服务器-客户端通信的策略,我认为是这样的:每个程序都有两个套接字——一个监听指定的端口,另一个用于向服务器/其他客户端发送数据。两个套接字在不同的线程上运行,这样我就可以同时读取和发送数据(某种程度上),这样等待数据就不会破坏我的性能。将有一个主服务器,其他客户端将直接连接到该服务器。客户端将只发送自己的数据,并直接从服务器接收数据。
现在我有一些问题:
- 使用STD::Thread是明智的吗?我听说它在Linux上很好用,但在Windows上就不那么好用了。PThreads会更好吗?
- 关于为多个平台(主要是Linux&Windows)编写一个代码,还有其他有趣的想法吗?还是我的已经足够好了? 关于服务器/客户端如何工作的策略,还有其他的想法或技巧吗?我写了一些简单的网络应用程序,但它不需要那么好的策略,所以我不确定从简单的想法中是否最好。我应该多久从客户端发送数据到服务器(从服务器到客户端)?我不想淹没网络,使服务器负载100%?
同时:它应该可以很好地工作在2-4个玩家同时,我不打算使用更多的时间。
直观地说,从多线程的目的来看,Linux + Pthread将是一个很好的组合。大量的关键任务系统都在这种组合上运行。然而,当我们谈到std::thread时,具有平台依赖性质是一个很好的特性。当然,如果一些不好的气味是在windows方言,微软将纠正他们的未来。但是,如果我是你,我肯定会选择Linux + std::线程组合。在Windows上选择Linux是一个不同的主题,这里不需要评论(从服务器开发的角度来看)。thread为您提供了一组很好的特性,同时具有pthread的功能。
关于UDP,你有优点和缺点。但是,我想说,如果你要打开你的服务器供公众使用,你也必须考虑网络防火墙。如果你能解决UDP固有的传输层问题(数据包重新排序,丢失的数据包恢复),UDP服务器在大多数情况下是轻量级的。
这取决于你的游戏来决定你需要多久发送一次消息。我不能评论。
此外,请更认真地注意数据通信的额外安全性。你的服务器迟早会被黑的。这只是时间的问题。
- 在c++中用vector填充一个简单的动态数组
- 欧拉项目#8答案是大以获得有效答案
- (C++)分析树以计算返回错误值的简单算术表达式
- 调整大小后指向元素值的指针unordered_map有效?
- 我的简单if-else语句是如何无法访问的代码
- 使用简单类型列表实现的指数编译时间.为什么
- 为什么是0;C++中的有效语句
- 将指针传递给函数在简单的情况下有效,但在"class" -izing 之后不起作用
- 我正在写一个非常简单的字母评分系统,if语句是最有效的吗?
- 使用for循环制作位图的最简单和最有效的方法
- 是否存在简单的指向布尔值作为线程取消标志的现实情况,无法有效地取消线程?
- 使用pinvoke调用的简单C++.dll;对我有效,但对其他人无效
- 如何仅验证int类型的输入..以一种非常简单但有效的方式?在c++中
- 有没有一种简单有效的方法来列出 C# 或 C/C++ 中的所有 USB 设备
- 遍历数组的简单任务.以下哪种解决方案最有效
- 为游戏(和其他任务)提供简单而有效的UDP服务器策略
- 有没有一种简单有效的方法可以在达到数据类型限制后动态更改数据类型?
- 为什么我的代码有效?简单的算术
- 创建一个简单的文本汇总算法的最有效方法
- 存储可通过键或序号 C++ 访问的数据的简单有效方法