前两天看到的一个c#的内存管理 DynamicBufferManager.cs
稍微阉割了一下
using System;
namespace IOCPLib.IOCP
{
public class DynamicBufferManager
{
public byte[] Buffer { get; set; } //存放内存的数组
public int DataCount { get; set; } //写入数据大小
public DynamicBufferManager(int bufferSize)
{
DataCount = 0;
Buffer = new byte[bufferSize];
}
public int GetDataCount() //获得当前写入的字节数
{
return DataCount;
}
public int GetReserveCount() //获得剩余的字节数
{
return Buffer.Length - DataCount;
}
public void Clear(int count) //清理指定大小的数据
{
if (count >= DataCount) //如果需要清理的数据大于现有数据大小,则全部清理
{
DataCount = 0;
}
else
{
for (int i = 0; i < DataCount - count; i++) //否则后面的数据往前移
{
Buffer[i] = Buffer[count + i];
}
DataCount = DataCount - count;
}
}
public void WriteBuffer(byte[] buffer, int offset, int count)
{
if (GetReserveCount() >= count) //缓冲区空间够,不需要申请
{
Array.Copy(buffer, offset, Buffer, DataCount, count);
DataCount = DataCount + count;
}
else //缓冲区空间不够,需要申请更大的内存,并进行移位
{
int totalSize = Buffer.Length + count - GetReserveCount(); //总大小-空余大小
byte[] tmpBuffer = new byte[totalSize];
Array.Copy(Buffer, 0, tmpBuffer, 0, DataCount); //复制以前的数据
Array.Copy(buffer, offset, tmpBuffer, DataCount, count); //复制新写入的数据
DataCount = DataCount + count;
Buffer = tmpBuffer; //替换
}
}
public void WriteBuffer(byte[] buffer)
{
WriteBuffer(buffer, 0, buffer.Length);
}
}
}
异步发送的内存管理类AsyncSendBufferManager.cs
using System;
using System.Collections.Generic;
namespace IOCPLib.IOCP
{
struct SendBufferPacket //记录每个包在内存中的offset和包长
{
public int Offset;
public int Count;
}
//发送需要等待上一次回调才发下一次的响应,由于用于异步发送,可能同时多个数据写入内存
public class AsyncSendBufferManager
{
private DynamicBufferManager m_dynamicBufferManager;
public DynamicBufferManager DynamicBufferManager
{ get { return m_dynamicBufferManager; } }
private List<SendBufferPacket> m_sendBufferList; //发送的数据包s
private SendBufferPacket m_sendBufferPacket;
public AsyncSendBufferManager(int bufferSize)
{
m_dynamicBufferManager = new DynamicBufferManager(bufferSize);
m_sendBufferList = new List<SendBufferPacket>();
m_sendBufferPacket.Offset = 0;
m_sendBufferPacket.Count = 0;
}
public void StartPacket() //StartPacket 和 EndPacket 成对调用
{
m_sendBufferPacket.Offset = m_dynamicBufferManager.DataCount;
m_sendBufferPacket.Count = 0;
}
public void EndPacket()
{
m_sendBufferPacket.Count = m_dynamicBufferManager.DataCount - m_sendBufferPacket.Offset;
m_sendBufferList.Add(m_sendBufferPacket);
}
public bool GetFirstPacket(ref int offset, ref int count)
{
if (m_sendBufferList.Count <= 0)
return false;
offset = m_sendBufferList[0].Offset;
count = m_sendBufferList[0].Count;
return true;
}
public bool ClearFirstPacket()
{
if (m_sendBufferList.Count <= 0)
return false;
int count = m_sendBufferList[0].Count;
m_dynamicBufferManager.Clear(count);
m_sendBufferList.RemoveAt(0);
return true;
}
public void ClearPacket()
{
m_sendBufferList.Clear();
m_dynamicBufferManager.Clear(m_dynamicBufferManager.DataCount);
}
}
}
调用方法 如下:
AsyncSendBufferManager asyncSendBufferManager = m_asyncUserToken.SendBuffer; //初始化
asyncSendBufferManager.StartPacket();//StartPacket 和 EndPacket 成对
asyncSendBufferManager.DynamicBufferManager.WriteBuffer(head.GetBuffer(), 0, (int)head.Length);//head和body为两个数据写入一个buffer
asyncSendBufferManager.DynamicBufferManager.WriteBuffer(body.GetBuffer(), 0, (int)body.Length);
asyncSendBufferManager.EndPacket();
以上可用于异步socket收发的内存管理