Skip to content

Commit 171b6a4

Browse files
release v1.0.8
- [fix] fix receive bug
1 parent c962635 commit 171b6a4

1 file changed

Lines changed: 26 additions & 14 deletions

File tree

Miku.Core/NetClient.cs

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)