@@ -88,6 +88,9 @@ public SpanReader(Stream stream, IPacket? data = null, Int32 bufferSize = 8192)
88
88
public void Advance ( Int32 count )
89
89
{
90
90
if ( count < 0 ) throw new ArgumentOutOfRangeException ( nameof ( count ) ) ;
91
+
92
+ if ( count > 0 ) EnsureSpace ( count ) ;
93
+
91
94
if ( _index + count > _span . Length ) throw new ArgumentOutOfRangeException ( nameof ( count ) ) ;
92
95
93
96
_index += count ;
@@ -118,8 +121,11 @@ public void EnsureSpace(Int32 size)
118
121
// 申请指定大小的数据包缓冲区,至少达到缓冲区大小,但不超过最大容量
119
122
var idx = 0 ;
120
123
var bsize = size ;
121
- if ( bsize < _bufferSize ) bsize = _bufferSize ;
122
- if ( MaxCapacity > 0 && bsize > MaxCapacity - _total ) bsize = MaxCapacity - _total ;
124
+ if ( MaxCapacity > 0 )
125
+ {
126
+ if ( bsize < _bufferSize ) bsize = _bufferSize ;
127
+ if ( bsize > MaxCapacity - _total ) bsize = MaxCapacity - _total ;
128
+ }
123
129
var pk = new OwnerPacket ( bsize ) ;
124
130
if ( _data != null && remain > 0 )
125
131
{
@@ -133,17 +139,16 @@ public void EnsureSpace(Int32 size)
133
139
_data = pk ;
134
140
_index = 0 ;
135
141
136
- // 多次读取,直到满足需求
137
- //var n = _stream.ReadExactly(pk.Buffer, pk.Offset + idx, pk.Length - idx);
138
- while ( idx < size )
139
- {
140
- // 实际缓冲区大小可能大于申请大小,充分利用缓冲区,避免多次读取
141
- var len = pk . Buffer . Length - pk . Offset ;
142
- var n = _stream . Read ( pk . Buffer , pk . Offset + idx , len - idx ) ;
143
- if ( n <= 0 ) break ;
142
+ // 多次读取,直到满足需求。不要超过最大容量,否则可能读取到下一个数据帧的数据
143
+ _stream . ReadExactly ( pk . Buffer , pk . Offset + idx , pk . Length - idx ) ;
144
+ idx = pk . Length ;
145
+ //while (idx < size)
146
+ //{
147
+ // var n = _stream.Read(pk.Buffer, pk.Offset + idx, pk.Length - idx);
148
+ // if (n <= 0) break;
144
149
145
- idx += n ;
146
- }
150
+ // idx += n;
151
+ // }
147
152
if ( idx < size )
148
153
throw new InvalidOperationException ( "Not enough data to read." ) ;
149
154
pk . Resize ( idx ) ;
0 commit comments