C#

[수정필요] NetCoreServer OnReceived 길이 읽기 저장용 샘플

Dongmin Jang 2022. 5. 1. 14:38
protected override void OnReceived(byte[] buffer, long offset, long size)
{
    _bufferedStream.Write(buffer, (int)offset, (int)size);
    _bufferedStream.Position = 0;
    _bufferedStream.Flush();

    int readOffset = 0;
    byte[] length = new byte[4];
    byte[] bufferToRead = new byte[65536];
    while (_bufferedStream.CanRead)
    {
        if (size < readOffset + 4)
        {
            return;
        }
        int nReadLengthBytes = _bufferedStream.Read(length, 0, 4);
        if (nReadLengthBytes < 4)
        {
            _bufferedStream.Seek(-nReadLengthBytes, SeekOrigin.Current);
            return;
        }
        readOffset = readOffset + 4;

        int nExpectBytes = BitConverter.ToInt32(length, 0);
        if (size < readOffset + nExpectBytes)
        {
            _bufferedStream.Seek(-nReadLengthBytes, SeekOrigin.Current);
            return;
        }
        int nReadBytes = _bufferedStream.Read(bufferToRead, 4, nExpectBytes);
        if (nReadBytes < nExpectBytes)
        {
            _bufferedStream.Seek(-(nReadLengthBytes + nReadBytes), SeekOrigin.Current);
            return;
        }
        readOffset = readOffset + nReadBytes;
        _bufferedStream.Flush();

        string data = Encoding.UTF8.GetString(bufferToRead, 4, nReadBytes);
        Message message = JsonConvert.DeserializeObject<Message>(data);
        MessageReceived?.Invoke(this, message);
    }
}