我需要知道哪种基于套接字的模型最适合具有多个同时连接的服务器,就像在MMORPG服务器中一样。
我已经读过有关c10k的文章,但是如果我的服务器一次只允许5000个客户端,该怎么办?阻塞套接字,线程化(每个客户端一个线程)?非阻塞套接字,非线程?一个仅处理几个线程的所有客户端的循环? IOCP?
简而言之,优点和缺点是什么?我已经在Google上搜索过,但是没有找到关于所有这些模型的具体“相对”文章。
还是有一种更简单的方法来处理c10k问题?
平台:Windows XP
最佳答案
我个人建议您使用基于IOCP的设计,但是随后我要说的是,由于我拥有an IOCP based framework,多年来我一直在使用here为客户端开发高性能服务器。
最近,我整理了一些偏爱IOCP而不是Windows上提供的其他模型的原因,这些在我的博客free set of C++ code with example servers上可以找到。
经常将“复杂性”作为避免IOCP的原因,但是,老实说,如果您正在执行“每个连接线程”以外的任何操作,则代码无论如何都将是相当复杂的。我有一个here,您可以看一下,它可以为您完成所有IOCP的工作,并且服务器示例是您自己的代码的良好起点。您可以从here获得它。
另外,我还有一个免费的(非商业用途)可插拔服务器平台,您可能会感兴趣。使用WASP,您只需编写一个带有一些特定入口点的dll,然后我就为您完成所有网络工作。
无论您决定采用哪一种模型,恕我直言,都是从DAY 0开始进行性能和负载测试。这样,您就可以知道目标硬件上可以支持多少并发连接,并且可以迅速发现不合适的设计决策。导致其下降。浪费服务器的并发性很容易。有关更多信息,请参见here。
自从Jay提到ENet ...以来,我发现我们基于IOCP的ENet服务器可以与标准Enet客户端代码一起很好地工作。但是请记住,ENet被设计为对等协议(protocol),因此当您开始尝试在服务器上使用它时会遇到一些挑战。使用标准的ENet代码,您实际上只有一个线程的网络泵,而这与IOCP所提供的可伸缩性无法相比。我最终从头开始重写ENet协议(protocol)处理代码,以与异步I/O和IOCP一起工作,这是一笔不小的工作。我目前正在使用该最新版本的ENet协议(protocol)作为此代码的新版本,并希望该代码在2011年初可用,并且可以与大量并发连接服务器情况下使用的标准ENet代码进行完整的性能比较。