using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Lskj.SocketService { struct SendBufferPacket { public int Offset; public int Count; } //由于是异步发送,有可能接收到两个命令,写入了两次返回,发送需要等待上一次回调才发下一次的响应 public class AsyncSendBufferManager { private DynamicBufferManager _dynamicBufferManager; public DynamicBufferManager DynamicBufferManager { get { return _dynamicBufferManager; } } private List _sendBufferList; private SendBufferPacket _sendBufferPacket; public AsyncSendBufferManager(int bufferSize) { _dynamicBufferManager = new DynamicBufferManager(bufferSize); _sendBufferList = new List(); _sendBufferPacket.Offset = 0; _sendBufferPacket.Count = 0; } public void StartPacket() { _sendBufferPacket.Offset = _dynamicBufferManager.DataCount; _sendBufferPacket.Count = 0; } public void EndPacket() { _sendBufferPacket.Count = _dynamicBufferManager.DataCount - _sendBufferPacket.Offset; _sendBufferList.Add(_sendBufferPacket); } public bool GetFirstPacket(ref int offset, ref int count) { if (_sendBufferList.Count <= 0) return false; offset = 0;//_sendBufferList[0].Offset;清除了第一个包后,后续的包往前移,因此Offset都为0 count = _sendBufferList[0].Count; return true; } public bool ClearFirstPacket() { if (_sendBufferList.Count <= 0) return false; int count = _sendBufferList[0].Count; _dynamicBufferManager.Clear(count); _sendBufferList.RemoveAt(0); return true; } public void ClearPacket() { _sendBufferList.Clear(); _dynamicBufferManager.Clear(_dynamicBufferManager.DataCount); } } }