fix: 限制UDP最大包字节数,修复了字节计算问题

This commit is contained in:
alivender 2025-07-07 21:53:55 +08:00
parent 287c416247
commit ef1a6c8208
1 changed files with 12 additions and 12 deletions

View File

@ -330,23 +330,23 @@ public class UDPClientPool
return new(new Exception("Message bus not working!")); return new(new Exception("Message bus not working!"));
// Calculate read times and segments // Calculate read times and segments
var maxBytesPerRead = 256 * (32 / 8); // 1024 bytes per read var max4BytesPerRead = 0x80; // 1024 bytes per read
var restBytes = dataLength % maxBytesPerRead; var rest4Bytes = dataLength % max4BytesPerRead;
var readTimes = restBytes != 0 ? var readTimes = (rest4Bytes != 0) ?
dataLength / maxBytesPerRead + 1 : (dataLength / max4BytesPerRead + 1) :
dataLength / maxBytesPerRead; (dataLength / max4BytesPerRead);
for (var i = 0; i < readTimes; i++) for (var i = 0; i < readTimes; i++)
{ {
// Calculate current segment size // Calculate current segment size
var isLastSegment = i == readTimes - 1; var isLastSegment = i == readTimes - 1;
var currentSegmentSize = isLastSegment ? restBytes : maxBytesPerRead; var currentSegmentSize = (isLastSegment && rest4Bytes != 0) ? rest4Bytes : max4BytesPerRead;
// Set burst length (in 32-bit words) // Set burst length (in 32-bit words)
opts.BurstLength = (byte)(currentSegmentSize / 4 - 1); opts.BurstLength = (byte)(currentSegmentSize - 1);
// Update address for current segment // Update address for current segment
opts.Address = devAddr + (uint)(i * maxBytesPerRead); opts.Address = devAddr + (uint)(i * max4BytesPerRead);
// Send read address package // Send read address package
ret = await UDPClientPool.SendAddrPackAsync(endPoint, new SendAddrPackage(opts)); ret = await UDPClientPool.SendAddrPackAsync(endPoint, new SendAddrPackage(opts));
@ -365,16 +365,16 @@ public class UDPClientPool
return new(new Exception($"Data is null at segment {i}, package: {retPackOpts.ToString()}")); return new(new Exception($"Data is null at segment {i}, package: {retPackOpts.ToString()}"));
// Validate received data length // Validate received data length
if (retPackOpts.Data.Length != currentSegmentSize) if (retPackOpts.Data.Length != currentSegmentSize * 4)
return new(new Exception($"Expected {currentSegmentSize} bytes but received {retPackOpts.Data.Length} bytes at segment {i}")); return new(new Exception($"Expected {currentSegmentSize * 4} bytes but received {retPackOpts.Data.Length} bytes at segment {i}"));
// Add received data to result // Add received data to result
resultData.AddRange(retPackOpts.Data); resultData.AddRange(retPackOpts.Data);
} }
// Validate total data length // Validate total data length
if (resultData.Count != dataLength) if (resultData.Count != dataLength * 4)
return new(new Exception($"Expected total {dataLength} bytes but received {resultData.Count} bytes")); return new(new Exception($"Expected total {dataLength * 4} bytes but received {resultData.Count} bytes"));
return resultData.ToArray(); return resultData.ToArray();
} }