C# Rookiss Part4 ๊ฒ์์๋ฒ : RecvBuffer
๐โโ๏ธRecvBuffer
๐ช๋ถ์
TCP์ ์ฑ ์์ 100๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋ฉด ๋ฌด์กฐ๊ฑด 100๋ฐ์ดํธ๋ฅผ ๋ฐ๋๋ค๊ณ ํ ์ ์๋ค. 80๋ฐ์ดํธ๋ง ์ฌ์์๋๋ฐ ์ด๋ฐ ๊ฒฝ์ฐ ๋๋จธ์ง 20๋ฐ์ดํธ๋ฅผ ์ถ๊ฐ๋ก ๋ฐ๊ณ ์์ฑ๋ ํจํท์ ๋ณด๋ด์ผ ํ๋ค.
RecvBuffer์์๋ ์ด๋ฌํ ๋ถ๋ถ์ ๋ค๋ฃฐ ๊ฒ์ด๋ค.
_readPos - ์ฝ๊ธฐ ์ปค์ ์์น _writePos - ์ฐ๊ธฐ ์ปค์ ์์น
Recv์์ฑ์ - BufferSize๋ฅผ ์ ํด Buffer๋ฅผ ๋ง๋ค์ด์ค
DataSize - ์ฌ์ฉํ ๋ฐ์ดํฐ FreeSize - ๋จ์ ๋ฐ์ดํฐ ๊ณต๊ฐ
ReadSegment - ์ฝ๊ธฐ ์ปค์๋ถํฐ DataSize๋งํผ์ ArraySegment๋ฅผ ๋ฐํ WriteSegment - ์ฐ๊ธฐ ์ปค์๋ถํฐ ๋จ์ ๊ณต๊ฐ๊น์ง์ ArraySegment๋ฅผ ๋ฐํ
Clean - ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ฒํผ๋ฅผ ๋ค์ธ ๋ ์ด๊ธฐํ ์์ผ์ฃผ๋ ํจ์, ๋ฑ ์๋ง๊ฒ ์ฐ๋ฉด ์ฝ๊ธฐ ์ปค์์ ์ฐ๊ธฐ ์ปค์๋ฅผ 0์ผ๋ก ์ด๋, ๊ทธ๋ ์ง ์๊ณ ์ฐ๋๋ ๊ธฐ๊ฐ ์๋ ๊ฒฝ์ฐ DataSize๋งํผ ๋ณต์ฌํ์ฌ ์ฒซ ์์น๋ก ์ด๋ ์ํจ ํ ์ฝ๊ธฐ ์ปค์๋ 0 ์ฐ๊ธฐ ์ปค์๋ DataSize๋งํผ ์ด๋
OnRead - ์ฝ๊ธฐ ์ปค์ ์ด๋ OnWrite - ์ฐ๊ธฐ ์ปค์ ์ด๋
๐ช์ ์ฒด์ฝ๋
namespace ServerCore
{
public class RecvBuffer
{
// [r][w][ ][ ][ ][ ][ ][ ]
ArraySegment<byte> _buffer;
int _readPos;
int _writePos;
public RecvBuffer(int bufferSize)
{
_buffer = new ArraySegment<byte>(new byte[bufferSize], 0, bufferSize);
}
public int DataSize { get { return _writePos - _readPos; } }
public int FreeSize { get { return _buffer.Count - _writePos; } }
public ArraySegment<byte> ReadSegment
{
get { return new ArraySegment<byte>(_buffer.Array, _buffer.Offset + _readPos, DataSize); }
}
public ArraySegment<byte> WriteSegment
{
get { return new ArraySegment<byte>(_buffer.Array, _buffer.Offset + _writePos, FreeSize); }
}
public void Clean()
{
int dataSize = DataSize;
if (dataSize == 0)
{
// ๋จ์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์์ ์์น๋ก ์ปค์๋ง ์ด๋
_readPos = _writePos = 0;
}
else
{
// ๋จ์ ์ฐ๋๋ ๊ธฐ๊ฐ ์์ผ๋ฉด ์์ ์์น๋ก ๋ณต์ฌ
Array.Copy(_buffer.Array, _buffer.Offset + _readPos, _buffer.Array, _buffer.Offset, DataSize);
_readPos = 0;
_writePos = dataSize;
}
}
public bool OnRead(int numOfBytes)
{
if (numOfBytes > DataSize)
return false;
_readPos += numOfBytes;
return true;
}
public bool OnWrite(int numOfBytes)
{
if (numOfBytes > FreeSize)
return false;
_writePos += numOfBytes;
return true;
}
}
}