finish receive udp data handle function
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user