为游戏(和其他任务)提供简单而有效的UDP服务器策略

Strategy for simple yet effective UDP server for gaming (and other tasks)

本文关键字:有效 简单 UDP 策略 服务器 游戏 其他 任务      更新时间:2023-10-16

我正试图实现我的想法,简单但非常有效的多线程服务器工作在UDP。主要目标是用于游戏(类)应用程序,但如果它也能用于其他目的就更好了。

我想使用这个API/技术等

  1. STD::多线程线程,因为它是c++标准的一部分,它应该是面向未来的,就我所见,它既简单又能很好地与c++一起工作。
  2. BSDSock (Linux) &WinSock2 (Windows)。我将创建一个名为Socket的抽象类,并为每个平台(Linux - BSD, Windows - WinSock)创建实现本机API的派生类。然后我会使用基类Socket提供的API,而不是本机/平台API。这将允许我使用一个代码为整个服务器/客户端模块,如果我想改变平台,我必须只是切换类类型的套接字,这就是它。

对于服务器-客户端通信的策略,我认为是这样的:每个程序都有两个套接字——一个监听指定的端口,另一个用于向服务器/其他客户端发送数据。两个套接字在不同的线程上运行,这样我就可以同时读取和发送数据(某种程度上),这样等待数据就不会破坏我的性能。将有一个主服务器,其他客户端将直接连接到该服务器。客户端将只发送自己的数据,并直接从服务器接收数据。

现在我有一些问题:

    使用STD::Thread是明智的吗?我听说它在Linux上很好用,但在Windows上就不那么好用了。PThreads会更好吗?
  1. 关于为多个平台(主要是Linux&Windows)编写一个代码,还有其他有趣的想法吗?还是我的已经足够好了?
  2. 关于服务器/客户端如何工作的策略,还有其他的想法或技巧吗?我写了一些简单的网络应用程序,但它不需要那么好的策略,所以我不确定从简单的想法中是否最好。我应该多久从客户端发送数据到服务器(从服务器到客户端)?我不想淹没网络,使服务器负载100%?

同时:它应该可以很好地工作在2-4个玩家同时,我不打算使用更多的时间。

直观地说,从多线程的目的来看,Linux + Pthread将是一个很好的组合。大量的关键任务系统都在这种组合上运行。然而,当我们谈到std::thread时,具有平台依赖性质是一个很好的特性。当然,如果一些不好的气味是在windows方言,微软将纠正他们的未来。但是,如果我是你,我肯定会选择Linux + std::线程组合。在Windows上选择Linux是一个不同的主题,这里不需要评论(从服务器开发的角度来看)。thread为您提供了一组很好的特性,同时具有pthread的功能。

关于UDP,你有优点和缺点。但是,我想说,如果你要打开你的服务器供公众使用,你也必须考虑网络防火墙。如果你能解决UDP固有的传输层问题(数据包重新排序,丢失的数据包恢复),UDP服务器在大多数情况下是轻量级的。

这取决于你的游戏来决定你需要多久发送一次消息。我不能评论。

此外,请更认真地注意数据通信的额外安全性。你的服务器迟早会被黑的。这只是时间的问题。