세션에서 ReceiveAsync 시 사용하는 버퍼를 효율적, 지속적으로 사용 하기 위해 구현
public RecvBuffer(int bufferSize)
{
_buffer = new ArraySegment<byte>(new byte[bufferSize], 0, bufferSize);
}
public void Clean()
{
int dataSize = DataSize;
if (dataSize == 0)
{
_readPos = 0;
_writePos = 0;
}
else
{
Array.Copy(_buffer.Array, _buffer.Offset + _readPos, _buffer.Array, _buffer.Offset, dataSize);
_readPos = 0;
_writePos = dataSize;
}
}
public bool OnRead(int numberOfBytes)
{
if (DataSize < numberOfBytes)
{
return false;
}
_readPos += numberOfBytes;
return true;
}
public bool OnWrite(int numberOfBytes)
{
if (FreeSize < numberOfBytes)
{
return false;
}
_writePos += numberOfBytes;
return true;
}
생성자에서 크기를 입력받아 해당 크기만큼 버퍼를 가지는 ArraySegment를 생성
세션은 데이터를 받으면 OnWrite를 하여 writePos를 변경시키고,
데이터를 읽어서 사용했으면 OnRead를 하여 readPos를 변경시킨다.
Clean 시에는 읽어가지 않은 데이터들과 readPos를 버퍼 맨 앞으로 이동시키고,
writePos를 적절한 곳에 위치시킨다.