From 342a5a2436bc6b88fdb1453f5cc67b65aaa7cb6e Mon Sep 17 00:00:00 2001 From: SikongJueluo Date: Thu, 3 Apr 2025 17:21:22 +0800 Subject: [PATCH] finish receive udp data handle function --- server/src/JtagController.cs | 10 +++- server/src/UdpServer.cs | 108 ++++++++++++++++++++++++++++++++--- 2 files changed, 110 insertions(+), 8 deletions(-) diff --git a/server/src/JtagController.cs b/server/src/JtagController.cs index bcbc267..850ccf2 100644 --- a/server/src/JtagController.cs +++ b/server/src/JtagController.cs @@ -30,16 +30,20 @@ public static class JtagAddr class Jtag { + readonly int timeout; readonly int port; readonly string address; private IPEndPoint ep; + private UDPServer server; - public Jtag(string address, int port) + public Jtag(string address, int port, UDPServer udpServer, int outTime = 2000) { this.address = address; this.port = port; this.ep = new IPEndPoint(IPAddress.Parse(address), port); + this.server = udpServer; + this.timeout = outTime; } public async ValueTask> ClearRegisters() @@ -64,6 +68,10 @@ class Jtag ret = await UDPClientPool.SendAddrPackAsync(ep, new SendAddrPackage(opts)); if (!ret) throw new Exception("Send 2rd Address Package Failed!"); + // Wait for Ack + var data = await UDPServer. + + return ret; } } diff --git a/server/src/UdpServer.cs b/server/src/UdpServer.cs index 740c4ad..87fac63 100644 --- a/server/src/UdpServer.cs +++ b/server/src/UdpServer.cs @@ -1,6 +1,7 @@ using System.Net; using System.Net.Sockets; using System.Text; +using DotNext; public struct UDPData { @@ -18,7 +19,8 @@ public class UDPServer private int listenPort; private UdpClient listener; private IPEndPoint groupEP; - private Dictionary udpData = new Dictionary(); + private Dictionary> udpData = new Dictionary>(); + private Mutex mutUdpData = new Mutex(); /// /// Construct a udp server with fixed port @@ -44,6 +46,84 @@ public class UDPServer } } + /// + /// Find UDP Receive Data According to ip address + /// + /// IP Address + /// UDP Data + public Optional FindData(string ipAddr) + { + UDPData? data = null; + try + { + var isOverTime = !mutUdpData.WaitOne(1000); + if (isOverTime) return Optional.None(); + // Get + var listData = udpData[ipAddr]; + data = listData[0]; + + // Delete + listData.RemoveAt(0); + } + catch + { + data = null; + } + finally + { + mutUdpData.ReleaseMutex(); + } + + // Return + if (data is null) + { + return Optional.None(); + } + else + { + return Optional.Some((UDPData)data); + } + } + + /// + /// Find UDP Receive Data Async + /// + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:return] + public async ValueTask> FindDataAsync(string ipAddr, int timeout = 1000) + { + var time = 0; + UDPData? data = null; + while (time < timeout) + { + await Task.Delay(1); + try + { + var isOverTime = !mutUdpData.WaitOne(timeout - time); + if (isOverTime) break; + // Get + var listData = udpData[ipAddr]; + data = listData[0]; + + // Delete + listData.RemoveAt(0); + } + catch + { + data = null; + } + finally + { + mutUdpData.ReleaseMutex(); + } + if (data is null) continue; + else break; + } + if ((time >= timeout) || (data is null)) { return Optional.None(); } + else { return Optional.Some((UDPData)data); } + } + private void ReceiveHandler(IAsyncResult res) { var remoteEP = new IPEndPoint(IPAddress.Any, listenPort); @@ -57,13 +137,27 @@ public class UDPServer var remoteAddress = remoteEP.Address.ToString(); var remotePort = remoteEP.Port; // Record UDP Receive Data - udpData.Add(remoteAddress, new UDPData() + if (udpData.ContainsKey(remoteAddress)) { - addr = remoteAddress, - port = remotePort, - data = bytes, - datetime = nowtime, - }); + var listData = udpData[remoteAddress]; + listData.Add(new UDPData() + { + addr = remoteAddress, + port = remotePort, + data = bytes, + datetime = nowtime, + }); + } + else + { + udpData.Add(remoteAddress, new List([new UDPData(){ + addr = remoteAddress, + port = remotePort, + data = bytes, + datetime = nowtime, + }])); + } + remoteStr = $"{remoteAddress}:{remotePort}"; } else