diff --git a/ShortDev.Networking/EndianReader.cs b/ShortDev.Networking/EndianReader.cs index 30f5fa7..7c90637 100644 --- a/ShortDev.Networking/EndianReader.cs +++ b/ShortDev.Networking/EndianReader.cs @@ -1,5 +1,6 @@ using System; using System.Buffers.Binary; +using System.Diagnostics; using System.IO; using System.Text; @@ -35,8 +36,8 @@ public ReadOnlySpan ReadBytes(int length) { if (Stream != null) { - Span buffer = new byte[length]; - Stream.Read(buffer); + var buffer = new byte[length]; + ReadStreamInternal(buffer); return buffer; } @@ -46,11 +47,33 @@ public ReadOnlySpan ReadBytes(int length) public void ReadBytes(Span buffer) { if (Stream != null) - Stream.Read(buffer); + ReadStreamInternal(buffer); else Buffer.ReadBytes(buffer); } + /// + /// BinaryReader.ReadBytes + /// + void ReadStreamInternal(Span buffer) + { + Debug.Assert(Stream != null); + + int count = buffer.Length; + int numRead = 0; + do + { + int n = Stream.Read(buffer[numRead..]); + if (n == 0) + throw new EndOfStreamException(); + + numRead += n; + count -= n; + } while (count > 0); + + Debug.Assert(numRead == buffer.Length); + } + public byte ReadByte() { if (Stream != null)