(原创文章,转载请注明来源:http://blog.csdn.net/hulihui)
在Socket的接收/发送方法:Send()、BeginSend()、Receive()、BeginReceive()中,第一个参数是字节数数组,表示当前接收数据区或需要发送的数据。普通Socket应用中,往往是接收/发送时创建数组,使用后数组空间由托管堆回收(Socket关闭后其关联的缓冲区情况类似)。显然,频繁创建接收/发送缓冲区将在托管堆上留下很多的内存碎块,影响系统性能。
使用Socket异步调事件参数类SocketAsyncEventArgs时考虑了上述情况,基本构思为:自定义一个缓冲区管理类如
BufferManager,开辟一个大的、可重用接收/发送收缓冲区,用于SendAsync()、ReceiveAsync()等方法,之前使用SetBuffer()和属性OffSet、Count设定缓冲区空间。
事实上,在.NET 2.0平台上的Socket传统APM(异步编程模型)中仍然可用该这个技术。下面是修改的BufferManager类:
public sealed class BufferManager
{
// ... 全部字段为private,类型和名称见构造函数
public BufferManager(int maxSessionCount, int receivevBufferSize, int sendBufferSize)
{
m_maxSessionCount = maxSessionCount; // 最大可连接客户端数, int
m_receiveBufferSize = receivevBu

该博客介绍了如何在C#中实现一个可复用的Socket通信方案,通过BufferManager类管理共享缓冲区,用于异步接收和发送数据。在接收时,计算缓冲区偏移地址进行异步操作;发送时,根据数据长度决定是否利用缓冲区。完成操作后,通过FreeBufferBlockIndex方法回收不再使用的缓冲区索引。

3504

被折叠的 条评论
为什么被折叠?



