receive buffer

ㅋㅋ·2022년 10월 31일

csharp게임서버

목록 보기
8/16

세션에서 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를 적절한 곳에 위치시킨다.

0개의 댓글