在启动多个客户端连接时,在.net35中使用AsyncSockets的好模式是什么

时间:2009-02-28 13:27:05

标签: performance .net-3.5 sockets asynchronous

我正在重建IM网关,并希望利用.net35的AsyncSockets中的新性能功能。

我现有的实现只是根据需要创建数据包并将用户的IM请求转发到各种IM网络,处理每个连接用户会话(套接字)的请求/响应流。

我现在不得不使用IasyncResult,因为你知道它不是很漂亮或可扩展。

我的困惑基本上是这样的:

1)在3.5中使用新的Begin / End和SocketAsyncEventArgs时,我们是否还需要为每个套接字创建一个SocketAsyncEventArgs?

2)我们通过预先初始化20000个客户端连接来获得任何东西,因为我们知道每台服务器的预期max_connections是20000

3)我们是否还需要使用LOH(大对象堆)分配byte []来处理接收数据,如MSDN上的SocketServers示例所示,我们并没有按照说法构建服务器,但是仍然处理很多每个连接的套接字独立接收。

4)也许我正在努力实现更好的模式?

提前致谢。

查尔斯。

1 个答案:

答案 0 :(得分:1)

1)IAsyncResult / Begin / End是一个与使用SocketAsyncEventArgs的“xAsync”方法完全不同的系统。你最好使用SocketAsyncEventArgs并完全删除Begin / End。

2)不是真的。初始化一个较小的数字(50?100?)并使用中间类(即/“资源池”)来管理它们。随着更多请求的进入,例如,将池增加50或100。随着资源需求的下降,困难的部分是有效地“缩减”合并项目的数量。大量的套接字/缓冲区/等将占用大量内存,因此最好只按服务器的要求分批分配它。

3)不需要使用它,但它仍然是一个好主意。在每次通话期间,缓冲区仍将被“固定”。