@@ -14,11 +14,12 @@ internal class MessageBuffer
1414 public int CurrentMsgBufferPos ;
1515 public int CurrentHeaderBufferPos ;
1616 public int ExpectedMsgLenght ;
17-
17+ private int originalCapacity ;
1818
1919 public MessageBuffer ( int capacity , int currentWriteIndex = 0 )
2020 {
2121 this . messageBuffer = new byte [ capacity ] ;
22+ originalCapacity = capacity ;
2223 CurrentMsgBufferPos = currentWriteIndex ;
2324 }
2425
@@ -36,11 +37,11 @@ private void Extend(int size)
3637 Array . Resize ( ref messageBuffer , size + messageBuffer . Length ) ;
3738 }
3839
39- public void AppendHeaderChunk ( byte [ ] headerPart , int count )
40+ public void AppendHeaderChunk ( byte [ ] headerPart , int offset , int count )
4041 {
4142 for ( int i = 0 ; i < count ; i ++ )
4243 {
43- AppendHeaderByte ( headerPart [ i ] ) ;
44+ AppendHeaderByte ( headerPart [ i + offset ] ) ;
4445 }
4546 }
4647
@@ -63,6 +64,7 @@ public byte[] GetMessageBytes()
6364 {
6465 byte [ ] bytes = new byte [ ExpectedMsgLenght ] ;
6566 Buffer . BlockCopy ( messageBuffer , 0 , bytes , 0 , ExpectedMsgLenght ) ;
67+
6668 return bytes ;
6769 }
6870
@@ -71,6 +73,11 @@ internal void Reset()
7173 CurrentHeaderBufferPos = 0 ;
7274 CurrentMsgBufferPos = 0 ;
7375 ExpectedMsgLenght = 0 ;
76+ if ( messageBuffer . Length > originalCapacity )
77+ {
78+ this . messageBuffer = new byte [ originalCapacity ] ;
79+ GC . Collect ( ) ;
80+ }
7481 }
7582 }
7683 internal class ByteMessageManager
@@ -119,31 +126,32 @@ private void HandleBytes(byte[] incomingBytes, int offset, int count)
119126
120127 private void HandleHeader ( byte [ ] incomingBytes , int offset , int count )
121128 {
122- if ( count >= currentExpectedByteLenght )
129+ if ( count - offset >= currentExpectedByteLenght )
123130 {
124- messageBuffer . AppendHeaderChunk ( incomingBytes , currentExpectedByteLenght ) ;
131+ messageBuffer . AppendHeaderChunk ( incomingBytes , 0 , currentExpectedByteLenght ) ;
125132
126133 // perfect msg
127134 if ( count - currentExpectedByteLenght == messageBuffer . ExpectedMsgLenght )
128135 {
129- MessageReady ( incomingBytes , MessageBuffer . HeaderLenght , messageBuffer . ExpectedMsgLenght ) ;
136+ MessageReady ( incomingBytes , currentExpectedByteLenght , messageBuffer . ExpectedMsgLenght ) ;
130137 messageBuffer . Reset ( ) ;
131138 }
132139 // multiple msgs or partial incomplete msg.
133140 else
134141 {
142+ offset += currentExpectedByteLenght ;
143+ //count -= currentExpectedByteLenght;
144+
135145 currentState = OperationState . AwaitingMsgBody ;
136146 currentExpectedByteLenght = messageBuffer . ExpectedMsgLenght ;
137- offset += MessageBuffer . HeaderLenght ;
138- count -= MessageBuffer . HeaderLenght ;
139147 HandleBody ( incomingBytes , offset , count ) ;
140148 }
141149 }
142150 // Fragmented header. we will get on next call,
143151 else
144152 {
145- messageBuffer . AppendHeaderChunk ( incomingBytes , count ) ;
146- currentExpectedByteLenght = MessageBuffer . HeaderLenght - count ;
153+ messageBuffer . AppendHeaderChunk ( incomingBytes , 0 , count ) ;
154+ currentExpectedByteLenght = MessageBuffer . HeaderLenght - ( count - offset ) ;
147155 }
148156
149157 }
@@ -152,7 +160,7 @@ private void HandleHeader(byte[] incomingBytes, int offset, int count)
152160 private void HandleBody ( byte [ ] incomingBytes , int offset , int count )
153161 {
154162 // overflown message
155- while ( count >= currentExpectedByteLenght )
163+ while ( count - offset >= currentExpectedByteLenght )
156164 {
157165 // nothing from prev call
158166 if ( messageBuffer . CurrentMsgBufferPos == 0 )
@@ -169,49 +177,46 @@ private void HandleBody(byte[] incomingBytes, int offset, int count)
169177 }
170178
171179 offset += currentExpectedByteLenght ;
172- count -= currentExpectedByteLenght ;
180+ // count -= currentExpectedByteLenght;
173181 // can read byte frame.
174- if ( count >= MessageBuffer . HeaderLenght )
182+ if ( count - offset >= MessageBuffer . HeaderLenght )
175183 {
176184 currentExpectedByteLenght = BufferManager . ReadByteFrame ( incomingBytes , offset ) ;
177185 offset += MessageBuffer . HeaderLenght ;
178- count -= MessageBuffer . HeaderLenght ;
186+ // count -= MessageBuffer.HeaderLenght;
179187 }
188+ //if (count < 4)
189+ //{ }
180190 // incomplete byte frame
181191 else
182192 {
183- messageBuffer . AppendMessageChunk ( incomingBytes , offset , count ) ;
193+ messageBuffer . AppendHeaderChunk ( incomingBytes , offset , count - offset ) ;
184194 currentState = OperationState . AwaitingMsgHeader ;
185- currentExpectedByteLenght = MessageBuffer . HeaderLenght - count ;
195+ currentExpectedByteLenght = MessageBuffer . HeaderLenght - ( count - offset ) ;
186196
187197 return ;
188198 }
189199 }
190200
191201 // incomplete msg,
192- if ( count < currentExpectedByteLenght )
202+ if ( count - offset < currentExpectedByteLenght )
193203 {
194- messageBuffer . AppendMessageChunk ( incomingBytes , offset , count ) ;
195- currentExpectedByteLenght = currentExpectedByteLenght - count ;
204+ messageBuffer . AppendMessageChunk ( incomingBytes , offset , count - offset ) ;
205+ currentExpectedByteLenght = currentExpectedByteLenght - ( count - offset ) ;
196206
197207 }
198- //// perfect size
199- //else
200- //{
201- // MessageReady(incomingBytes, offset, count);
202- // messageBuffer.Reset();
203-
204- // currentExpectedByteLenght = MessageBuffer.HeaderLenght;
205- // currentState = OperationState.AwaitingMsgHeader;
206- //}
208+
207209 }
208210 private void MessageReady ( MessageBuffer buffer )
209211 {
210212 //var byteMsg = buffer.GetMessageBytes();
211- OnMessageReady ? . Invoke ( buffer . messageBuffer , 0 , buffer . CurrentMsgBufferPos ) ;
213+ //OnMessageReady?.Invoke(buffer.messageBuffer, 0, buffer.CurrentMsgBufferPos);
214+ MessageReady ( buffer . messageBuffer , 0 , buffer . CurrentMsgBufferPos ) ;
212215 }
213- private void MessageReady ( byte [ ] byteMsg , int offset , int count )
216+ private void MessageReady ( byte [ ] byteMsg , int offset , int count )
214217 {
218+ if ( count != 5 )
219+ { }
215220 OnMessageReady ? . Invoke ( byteMsg , offset , count ) ;
216221 }
217222 }
0 commit comments