Merge branch 'master' of ssh://git.swordlost.top:222/SikongJueluo/FPGA_WebLab

This commit is contained in:
alivender
2025-05-20 20:09:42 +08:00
committed by SikongJueluo
10 changed files with 92 additions and 78 deletions

View File

@@ -22,6 +22,11 @@ public class UDPData
/// 发送来源的端口号
/// </summary>
public required int Port { get; set; }
/// <summary>
/// 任务ID
/// </summary>
public required int TaskID { get; set; }
/// <summary>
/// 接受到的数据
/// </summary>
@@ -44,6 +49,7 @@ public class UDPData
DateTime = this.DateTime,
Address = new string(this.Address),
Port = this.Port,
TaskID = this.TaskID,
Data = cloneData,
HasRead = this.HasRead
};
@@ -119,6 +125,7 @@ public class UDPServer
/// 异步寻找目标发送的内容
/// </summary>
/// <param name="ipAddr"> 目标IP地址 </param>
/// <param name="taskID">[TODO:parameter]</param>
/// <param name="timeout">超时时间</param>
/// <param name="cycle">延迟时间</param>
/// <param name="callerName">调用函数名称</param>
@@ -129,13 +136,14 @@ public class UDPServer
/// Optional 存在时,为最先收到的数据
/// </returns>
public async ValueTask<Optional<UDPData>> FindDataAsync(
string ipAddr, int timeout = 1000, int cycle = 0,
string ipAddr, int taskID, int timeout = 1000, int cycle = 0,
[CallerMemberName] string callerName = "",
[CallerLineNumber] int callerLineNum = 0)
[CallerLineNumber] int callerLineNum = 0
)
{
UDPData? data = null;
logger.Debug($"Caller \"{callerName}|{callerLineNum}\": Try to find {ipAddr} UDP Data");
logger.Debug($"Caller \"{callerName}|{callerLineNum}\": Try to find {ipAddr}-{taskID} UDP Data");
var startTime = DateTime.Now;
var isTimeout = false;
@@ -149,8 +157,8 @@ public class UDPServer
timeleft = TimeSpan.FromMilliseconds(timeout) - elapsed;
using (await udpData.AcquireWriteLockAsync(timeleft))
{
if (udpData.ContainsKey(ipAddr) &&
udpData.TryGetValue(ipAddr, out var dataQueue) &&
if (udpData.ContainsKey($"{ipAddr}-{taskID}") &&
udpData.TryGetValue($"{ipAddr}-{taskID}", out var dataQueue) &&
dataQueue.Count > 0)
{
data = dataQueue.Dequeue();
@@ -177,10 +185,11 @@ public class UDPServer
/// 获取还未被读取的数据列表
/// </summary>
/// <param name="ipAddr">IP地址</param>
/// <param name="taskID">[TODO:parameter]</param>
/// <param name="timeout">超时时间</param>
/// <param name="cycle">延迟时间</param>
/// <returns>数据列表</returns>
public async ValueTask<Optional<List<UDPData>>> GetDataArrayAsync(string ipAddr, int timeout = 1000, int cycle = 0)
public async ValueTask<Optional<List<UDPData>>> GetDataArrayAsync(string ipAddr, int taskID, int timeout = 1000, int cycle = 0)
{
List<UDPData>? data = null;
@@ -196,8 +205,8 @@ public class UDPServer
timeleft = TimeSpan.FromMilliseconds(timeout) - elapsed;
using (await udpData.AcquireReadLockAsync(timeleft))
{
if (udpData.ContainsKey(ipAddr) &&
udpData.TryGetValue(ipAddr, out var dataQueue) &&
if (udpData.ContainsKey($"{ipAddr}-{taskID}") &&
udpData.TryGetValue($"{ipAddr}-{taskID}", out var dataQueue) &&
dataQueue.Count > 0)
{
data = dataQueue.ToList();
@@ -226,9 +235,9 @@ public class UDPServer
/// <param name="timeout">超时时间范围</param>
/// <returns>接收响应包</returns>
public async ValueTask<Result<WebProtocol.RecvRespPackage>> WaitForAckAsync
(string address, int port = -1, int timeout = 1000)
(string address, int taskID, int port = -1, int timeout = 1000)
{
var data = await FindDataAsync(address, timeout);
var data = await FindDataAsync(address, taskID, timeout);
if (!data.HasValue)
return new(new Exception("Get None even after time out!"));
@@ -251,9 +260,9 @@ public class UDPServer
/// <param name="timeout">超时时间范围</param>
/// <returns>接收数据包</returns>
public async ValueTask<Result<RecvDataPackage>> WaitForDataAsync
(string address, int port = -1, int timeout = 1000)
(string address, int taskID, int port = -1, int timeout = 1000)
{
var data = await FindDataAsync(address, timeout);
var data = await FindDataAsync(address, taskID, timeout);
if (!data.HasValue)
return new(new Exception("Get None even after time out!"));
@@ -284,7 +293,7 @@ public class UDPServer
// Handle Package
var udpData = RecordUDPData(bytes, remoteEP);
var udpData = RecordUDPData(bytes, remoteEP, Convert.ToInt32(bytes[1]));
PrintData(udpData);
BEGIN_RECEIVE:
@@ -308,7 +317,7 @@ public class UDPServer
else { return false; }
}
private UDPData RecordUDPData(byte[] bytes, IPEndPoint remoteEP)
private UDPData RecordUDPData(byte[] bytes, IPEndPoint remoteEP, int taskID)
{
var remoteAddress = remoteEP.Address.ToString();
var remotePort = remoteEP.Port;
@@ -316,6 +325,7 @@ public class UDPServer
{
Address = remoteAddress,
Port = remotePort,
TaskID = taskID,
Data = bytes,
DateTime = DateTime.Now,
HasRead = false,
@@ -324,7 +334,8 @@ public class UDPServer
using (udpData.AcquireWriteLock())
{
// Record UDP Receive Data
if (udpData.ContainsKey(remoteAddress) && udpData.TryGetValue(remoteAddress, out var dataQueue))
if (udpData.ContainsKey($"{remoteAddress}-{taskID}") &&
udpData.TryGetValue($"{remoteAddress}-{taskID}", out var dataQueue))
{
dataQueue.Enqueue(data);
logger.Trace("Receive data from old client");
@@ -333,7 +344,7 @@ public class UDPServer
{
var queue = new Queue<UDPData>();
queue.Enqueue(data);
udpData.Add(remoteAddress, queue);
udpData.Add($"{remoteAddress}-{taskID}", queue);
logger.Trace("Receive data from new client");
}
}
@@ -410,12 +421,12 @@ public class UDPServer
/// </summary>
/// <param name="ipAddr">IP地址</param>
/// <returns>无</returns>
public async Task ClearUDPData(string ipAddr)
public async Task ClearUDPData(string ipAddr, int taskID)
{
using (await udpData.AcquireWriteLockAsync())
{
if (udpData.ContainsKey(ipAddr) &&
udpData.TryGetValue(ipAddr, out var dataQueue) &&
if (udpData.ContainsKey($"{ipAddr}-{taskID}") &&
udpData.TryGetValue($"{ipAddr}-{taskID}", out var dataQueue) &&
dataQueue.Count > 0)
{
dataQueue.Clear();