@@ -134,7 +134,7 @@ internal void Connect(Socket socket, int bufferSize = 1024)
134134 _socket . NoDelay = true ;
135135 Interlocked . Exchange ( ref _isConnected , 1 ) ;
136136 Ip = ( ( System . Net . IPEndPoint ) socket . RemoteEndPoint ! ) . Address . ToString ( ) ;
137-
137+
138138 _receivedData = new ArrayBufferWriter < byte > ( bufferSize ) ;
139139 _sendQueue = new ConcurrentQueue < ArraySegment < byte > > ( ) ;
140140
@@ -164,6 +164,7 @@ public void Stop()
164164 {
165165 return ;
166166 }
167+
167168 Interlocked . Exchange ( ref _isConnected , 0 ) ;
168169 Interlocked . Exchange ( ref _sending , 0 ) ;
169170
@@ -440,30 +441,41 @@ private static void Receive(SocketAsyncEventArgs args)
440441 cont_receive :
441442 if ( totalConsumed > 0 )
442443 {
443- // copy tail of receivedData to a temporary buffer
444- if ( hasLeftover )
444+ // not completely consumed
445+ if ( totalConsumed < args . BytesTransferred )
445446 {
446- byte [ ] tempBuffer =
447- ArrayPool < byte > . Shared . Rent ( client . _receivedData . WrittenCount - totalConsumed ) ;
448- client . _receivedData . WrittenMemory . Span . Slice ( totalConsumed ) . CopyTo ( tempBuffer ) ;
449- client . _receivedData . Clear ( ) ;
450- client . _receivedData . Write ( tempBuffer ) ;
451- ArrayPool < byte > . Shared . Return ( tempBuffer ) ;
447+ // copy tail of receivedData to a temporary buffer
448+ if ( hasLeftover )
449+ {
450+ byte [ ] tempBuffer =
451+ ArrayPool < byte > . Shared . Rent ( client . _receivedData . WrittenCount - totalConsumed ) ;
452+ client . _receivedData . WrittenMemory . Span . Slice ( totalConsumed ) . CopyTo ( tempBuffer ) ;
453+ client . _receivedData . Clear ( ) ;
454+ client . _receivedData . Write ( tempBuffer ) ;
455+ ArrayPool < byte > . Shared . Return ( tempBuffer ) ;
456+ }
457+ else
458+ {
459+ client . _receivedData . Clear ( ) ;
460+ client . _receivedData . Write ( args . Buffer . AsSpan ( totalConsumed ,
461+ args . BytesTransferred - totalConsumed ) ) ;
462+ }
452463 }
453464 else
454465 {
455466 client . _receivedData . Clear ( ) ;
456- client . _receivedData . Write ( args . Buffer . AsSpan ( totalConsumed ,
457- args . BytesTransferred - totalConsumed ) ) ;
458467 }
459468 }
469+ // consumed nothing
460470 else
461471 {
462- // reset buffer
463- if ( client . _receivedData . WrittenCount > 0 )
472+ if ( hasLeftover )
473+ {
464474 client . _receivedData . Clear ( ) ;
465- }
475+ }
466476
477+ client . _receivedData . Write ( processData . Span ) ;
478+ }
467479
468480 if ( client . _socket != null )
469481 {
0 commit comments