C++ 用于游戏(和其他任务)的简单而有效的UDP服务器策略

C++ 用于游戏(和其他任务)的简单而有效的UDP服务器策略,c++,multithreading,sockets,client-side,C++,Multithreading,Sockets,Client Side,我试图实现我的想法,即在UDP上工作的简单但非常有效的多线程服务器。主要目标是用于游戏(类)应用程序,但如果它也可以用于其他用途,那就太好了 我想使用这个API/技术等 STD::多线程的线程,因为它是C++标准的一部分,它应该是未来的证明,而且我看到它既简单又用C++工作得很好。 BSDSock(Linux)和WinSock2(Windows)。我将创建一个名为Socket的抽象类,并为每个平台(Linux-BSD、Windows-WinSock)创建实现本机API的派生类。然后我将使用基类

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

我想使用这个API/技术等

  • STD::多线程的线程,因为它是C++标准的一部分,它应该是未来的证明,而且我看到它既简单又用C++工作得很好。
  • BSDSock(Linux)和WinSock2(Windows)。我将创建一个名为Socket的抽象类,并为每个平台(Linux-BSD、Windows-WinSock)创建实现本机API的派生类。然后我将使用基类套接字提供的API,而不是本机/平台API。这将允许我对整个服务器/客户机模块使用一个代码,如果我想更改平台,我只需切换套接字的类类型,就可以了
  • 至于服务器-客户端通信的策略,我想到了这样的想法: 每个程序都有两个套接字—一个用于侦听指定端口,另一个用于向服务器/其他客户端发送数据。这两个套接字都运行在不同的线程上,因此我可以同时读取和发送数据(某种程度上),这样等待数据不会破坏我的性能。将有一个主服务器,其他客户端将直接连接到该服务器。客户端将只发送数据,并直接从服务器接收数据

    现在我有一些问题

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

  • 另外:它应该可以同时与2-4个播放器配合使用,目前我不打算再与其他播放器配合使用。

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

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

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


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

    要获得独立于操作系统的功能,您应该查看或。另外,请试着一次问一个问题,因为这是你的问题,而且范围很广@πάνταῥεῖ - 是的,我意识到使用像boost这样的lib会更容易,也会更好,但我想为自己学点东西,写这样的东西会给我一些关于这个主题的内部知识和经验。我正在尝试做一些跨平台的东西(在Linux和windows上),我想使用一个lib/API来实现这一点。所以你说在linux和windows上使用STD::thread会更好,对吗?2.UDP停留,因为它将是实时多人游戏,所以我需要速度。一些数据丢失是可以接受的。3.至于安全性,我计划它是一个小游戏,也许不会有太多的ppl会玩,所以现在它不是大问题。我认为它不会那么受欢迎;)不过我想说的是,这对未来的关注是有好处的。通常情况下,使用windows线程很糟糕。至少从服务器应用程序的角度来看。不管是windows线程还是std::thread,尽可能忽略服务器的windows。如果它是windows中的std::thread,那么它最终应该访问windows操作系统级别的功能。在服务器应用程序中使用Windows有很多实际失败的例子。@ SARGERAN< <代码>:ST::VS C++ 2013中的线程< /COD>实现应该是正确的。ῥεῖ 听到这个消息真是太好了。