Files
lserp_cs_6.0/插件库/Lskj.SocketService/AsyncSocketCore/AsyncSendBufferManager.cs
T
cyf ab56a9bcf7 基线 SVN r240
SVN-Revision: r240
2025-02-06 06:46:06 +00:00

68 lines
2.1 KiB
C#

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<SendBufferPacket> _sendBufferList;
private SendBufferPacket _sendBufferPacket;
public AsyncSendBufferManager(int bufferSize)
{
_dynamicBufferManager = new DynamicBufferManager(bufferSize);
_sendBufferList = new List<SendBufferPacket>();
_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);
}
}
}