All Articles

C#

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

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);
    }
}

'C#' 카테고리의 다른 글

Dictionary Pair 실행 시간 측정  (0) 2022.08.24
[C#] Enable Windows 10 Mobile HotSpot  (0) 2022.06.14
PathHelper - 파일 생성 및 리드할 때 디렉토리 확인용  (0) 2022.05.01
JsonHelper - Newtonsoft 이용  (0) 2022.05.01
Sliding Stream  (0) 2022.05.01