使用单个线程维护许多套接字连接

时间:2009-11-18 08:43:20

标签: sockets tcp

我看到很多关于套接字通信的教程似乎每个套接字使用1个线程。但是在用于在线游戏的服务器上,你可能拥有10k并发用户--10k线程可能不是一个好主意。 我遇到了一个工具(SmartFox),该工具声称使用单个线程来监控所有套接字连接,可能有数千个。这个应用程序恰好是Java,但我认为C ++或C#也可以这样做......你会怎样实现这个目标?

4 个答案:

答案 0 :(得分:4)

The C10K problem谈论这个问题。

答案 1 :(得分:0)

实施排队系统,其中一个线程轮询网络,x个线程充当工作线程。您需要围绕代码实现关键部分,这会使连接出列并排队。

答案 2 :(得分:0)

如果您使用的是C ++,请查看boost :: asio。

当然,制作自己也很有趣。

答案 3 :(得分:0)

既然你提到过C ++ ......

如果您使用的是Windows平台,那么您应该查看I / O完成端口以获得这种可扩展性。 I / O完成端口允许您使用少量线程在套接字(和其他设备)上执行异步I / O,以服务数千个I / O操作(即连接)。

这种方式的工作方式是I / O完成端口本质上是一个队列,但操作系统优化了线程的释放方式以处理该队列中的工作项,以防止一次释放太多线程并确保刚刚使用的线程更有可能再次使用。请参阅此处:http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx获取有关IOCP的MSDN信息,此处:http://www.serverframework.com/products---the-free-framework.html获取有关使用IOCP的免费客户端/服务器框架的源代码。

作为可扩展性的一个例子,在这篇博客文章(http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html)中,我详细介绍了如何在Windows Server 2003计算机上实现超过70,000个并发连接,只有760MB内存。

请注意,C#异步套接字操作使用IOCPs。