Skip to content

Commit 4ce7310

Browse files
committed
feat: 支持多次粘包处理功能
1 parent 62ed6e6 commit 4ce7310

File tree

1 file changed

+29
-17
lines changed

1 file changed

+29
-17
lines changed

src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,28 +28,40 @@ public override async Task ReceiveAsync(Memory<byte> data)
2828
// 处理上次粘包数据
2929
data = ConcatBuffer(data);
3030

31-
// 拷贝数据
32-
var len = length - _receivedLength;
33-
var segment = data.Length > len ? data[..len] : data;
34-
segment.CopyTo(_data[_receivedLength..]);
35-
36-
if (data.Length > len)
31+
while (data.Length > 0)
3732
{
38-
SlicePackage(data, data.Length - len);
39-
}
33+
// 拷贝数据
34+
var len = length - _receivedLength;
35+
var segment = data.Length > len ? data[..len] : data;
36+
segment.CopyTo(_data[_receivedLength..]);
4037

41-
// 更新已接收长度
42-
_receivedLength += segment.Length;
38+
// 更新已接收长度
39+
_receivedLength += segment.Length;
4340

44-
// 如果已接收长度等于总长度则触发回调
45-
if (_receivedLength == length)
46-
{
47-
// 重置已接收长度
48-
_receivedLength = 0;
49-
if (ReceivedCallBack != null)
41+
// 如果已接收长度等于总长度则触发回调
42+
if (_receivedLength == length)
43+
{
44+
// 重置已接收长度
45+
_receivedLength = 0;
46+
if (ReceivedCallBack != null)
47+
{
48+
await ReceivedCallBack(_data);
49+
}
50+
}
51+
52+
// 检查剩余长度是否大于总长度
53+
if (data.Length >= segment.Length + length)
54+
{
55+
data = data[segment.Length..];
56+
continue;
57+
}
58+
59+
// 缓存剩余数据
60+
if (data.Length > len)
5061
{
51-
await ReceivedCallBack(_data);
62+
SlicePackage(data, data.Length - len);
5263
}
64+
break;
5365
}
5466
}
5567
}

0 commit comments

Comments
 (0)