finish receive udp data handle function
This commit is contained in:
parent
2af0986d67
commit
342a5a2436
|
@ -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<Result<bool>> 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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<string, UDPData> udpData = new Dictionary<string, UDPData>();
|
||||
private Dictionary<string, List<UDPData>> udpData = new Dictionary<string, List<UDPData>>();
|
||||
private Mutex mutUdpData = new Mutex();
|
||||
|
||||
/// <summary>
|
||||
/// 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)
|
||||
{
|
||||
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<UDPData>([new UDPData(){
|
||||
addr = remoteAddress,
|
||||
port = remotePort,
|
||||
data = bytes,
|
||||
datetime = nowtime,
|
||||
}]));
|
||||
}
|
||||
|
||||
remoteStr = $"{remoteAddress}:{remotePort}";
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Reference in New Issue