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
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue