首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于多个并发连接,我应该使用哪种基于套接字的模型?

对于多个并发连接,我应该使用哪种基于套接字的模型?
EN

Stack Overflow用户
提问于 2010-11-11 07:06:55
回答 4查看 1.8K关注 0票数 3

我需要知道哪种基于套接字的模型最适合具有多个并发连接的服务器,就像在MMORPG服务器中一样。

我读过关于c10k的文章,但是如果我的服务器一次只允许5000个客户端,我应该使用什么呢?阻塞套接字,线程化(每个客户端一个线程)?非阻塞套接字,非线程?在几个线程中处理所有客户端的循环?IOCP?

简而言之,它的优点和缺点是什么?我已经在谷歌上搜索过了,但我没有找到关于所有这些模型的具体的“对比”文章。

或者有没有更简单的方法来处理c10k问题?

平台: windows XP

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-11 18:07:51

就我个人而言,我建议你使用基于IOCP的设计,但我会说,因为我有an IOCP based framework,我多年来一直使用它来为客户开发高性能服务器。

我最近把我喜欢IOCP而不是windows上的其他型号的一些原因汇总在一起,它们可以在我的博客here上找到。

通常,“复杂性”被认为是避免IOCP的一个原因,但是,老实说,如果你要做的不是“每个连接的线程”,那么代码无论如何都会相当复杂。我有一个free set of C++ code with example servers,你可以看看,它为你做了所有的IOCP工作,服务器示例是你自己代码的一个很好的起点。您可以从here获得它。

或者,我也有一个免费的(非商业用途)可插拔的服务器平台,您可能会感兴趣。使用WASP,您只需编写一个具有特定入口点的dll,我就可以为您完成所有的联网工作……有关下载,请参阅here,教程请参阅here

无论你选择哪种模型,最重要的一件事,IMHO,就是从第0天开始进行性能和负载测试。这样,您就可以知道在目标硬件上可以支持多少个并发连接,并且可以快速发现导致中断的不适当的设计决策。很容易浪费服务器的并发性。有关详细信息,请参阅here

自从Jay提到ENet..。我发现我们的基于IOCP的ENet服务器与标准的Enet客户端代码工作得很好。但请记住,ENet被设计为点对点协议,因此当您开始尝试在服务器上使用它时,会遇到一些挑战。使用标准的ENet代码,您基本上只有一个单线程网络泵,这无法与您从IOCP获得的可伸缩性相比。我最终从头开始重写了ENet协议处理代码,以处理异步I/O和IOCP,这是一项不平凡的工作。我目前正在做这段代码的一个新版本,它使用最新的ENet协议作为基础,希望在2011年初可以与标准ENet代码进行完整的性能比较,这些代码用于大量并发连接服务器的情况。

票数 4
EN

Stack Overflow用户

发布于 2010-11-11 08:14:11

决定以何种方式与服务器交互在很大程度上取决于客户端将如何发送数据、发送什么类型的数据、预期的传输速率和流量模式。

例如,如果你正在编写一个游戏,允许人们聚集在一个虚拟的礼堂里播放音乐,那么你基本上就是在做大量的流媒体。

如果你有一个多人吃豆人,那么当方向改变时,你可以发送小的数据包,所以它不会是恒定的,而是突发的。

然后,您可以决定是否必须保证数据包的顺序,以及发送的每个数据包的重要性,因为这样您就需要考虑传输控制协议或UDP协议。(http://www.skullbox.net/tcpudp.php)

如果你想支持5000个客户端,那么线程的数量可能是一个性能问题,这取决于有多少内存,但更重要的是,你有多少核心以及cpu处理的密集度,但它很可能会成为性能杀手。

然后您可以看看select() (http://www.lowtek.com/sockets/select.html),它允许较少的线程来处理负载,但是,如果您是流式传输,那么这可能是一个问题,因为专用线程更有意义。

因此,如何决定哪一个是最好的取决于你正在编写的游戏类型,因为两者都可能是有用的,这取决于场景。

票数 1
EN

Stack Overflow用户

发布于 2010-11-11 07:17:11

你看过this的文章了吗?

我做了类似的研究,找到了eNet库。我相信它使用Select()而不是任何较新的方法,但有许多用户表示他们使用它取得了非常好的结果。如果你确实需要这么多的同时连接,那么改变起来并不困难。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4149993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档