finish receive udp data handle function

This commit is contained in:
SikongJueluo 2025-04-03 17:21:22 +08:00
parent 2af0986d67
commit 342a5a2436
No known key found for this signature in database
2 changed files with 110 additions and 8 deletions

View File

@ -30,16 +30,20 @@ public static class JtagAddr
class Jtag class Jtag
{ {
readonly int timeout;
readonly int port; readonly int port;
readonly string address; readonly string address;
private IPEndPoint ep; 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.address = address;
this.port = port; this.port = port;
this.ep = new IPEndPoint(IPAddress.Parse(address), port); this.ep = new IPEndPoint(IPAddress.Parse(address), port);
this.server = udpServer;
this.timeout = outTime;
} }
public async ValueTask<Result<bool>> ClearRegisters() public async ValueTask<Result<bool>> ClearRegisters()
@ -64,6 +68,10 @@ class Jtag
ret = await UDPClientPool.SendAddrPackAsync(ep, new SendAddrPackage(opts)); ret = await UDPClientPool.SendAddrPackAsync(ep, new SendAddrPackage(opts));
if (!ret) throw new Exception("Send 2rd Address Package Failed!"); if (!ret) throw new Exception("Send 2rd Address Package Failed!");
// Wait for Ack
var data = await UDPServer.
return ret; return ret;
} }
} }

View File

@ -1,6 +1,7 @@
using System.Net; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
using System.Text; using System.Text;
using DotNext;
public struct UDPData public struct UDPData
{ {
@ -18,7 +19,8 @@ public class UDPServer
private int listenPort; private int listenPort;
private UdpClient listener; private UdpClient listener;
private IPEndPoint groupEP; private IPEndPoint groupEP;
private Dictionary<string, UDPData> udpData = new Dictionary<string, UDPData>(); private Dictionary<string, List<UDPData>> udpData = new Dictionary<string, List<UDPData>>();
private Mutex mutUdpData = new Mutex();
/// <summary> /// <summary>
/// Construct a udp server with fixed port /// Construct a udp server with fixed port
@ -44,6 +46,84 @@ public class UDPServer
} }
} }
/// <summary>
/// Find UDP Receive Data According to ip address
/// </summary>
/// <param name="ipAddr"> IP Address</param>
/// <returns>UDP Data</returns>
public Optional<UDPData> FindData(string ipAddr)
{
UDPData? data = null;
try
{
var isOverTime = !mutUdpData.WaitOne(1000);
if (isOverTime) return Optional.None<UDPData>();
// 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<UDPData>();
}
else
{
return Optional.Some((UDPData)data);
}
}
/// <summary>
/// Find UDP Receive Data Async
/// </summary>
/// <param name="ipAddr">[TODO:parameter]</param>
/// <param name="timeout">[TODO:parameter]</param>
/// <returns>[TODO:return]</returns>
public async ValueTask<Optional<UDPData>> 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<UDPData>(); }
else { return Optional.Some((UDPData)data); }
}
private void ReceiveHandler(IAsyncResult res) private void ReceiveHandler(IAsyncResult res)
{ {
var remoteEP = new IPEndPoint(IPAddress.Any, listenPort); var remoteEP = new IPEndPoint(IPAddress.Any, listenPort);
@ -57,13 +137,27 @@ public class UDPServer
var remoteAddress = remoteEP.Address.ToString(); var remoteAddress = remoteEP.Address.ToString();
var remotePort = remoteEP.Port; var remotePort = remoteEP.Port;
// Record UDP Receive Data // Record UDP Receive Data
udpData.Add(remoteAddress, new UDPData() if (udpData.ContainsKey(remoteAddress))
{ {
addr = remoteAddress, var listData = udpData[remoteAddress];
port = remotePort, listData.Add(new UDPData()
data = bytes, {
datetime = nowtime, addr = remoteAddress,
}); port = remotePort,
data = bytes,
datetime = nowtime,
});
}
else
{
udpData.Add(remoteAddress, new List<UDPData>([new UDPData(){
addr = remoteAddress,
port = remotePort,
data = bytes,
datetime = nowtime,
}]));
}
remoteStr = $"{remoteAddress}:{remotePort}"; remoteStr = $"{remoteAddress}:{remotePort}";
} }
else else