/// <summary>
        /// 启动UDP,可重复调用,不影响已启动Udp监听的网卡
        /// </summary>
        /// <param name="strErr"></param>
        /// <returns></returns>
        public bool StartUdp(ref string strErr)
        {
            strErr = "";
            if (IsOpen)
            {
                return(true);
            }
            try
            {
                List <string> localIps = this.GetLocalIPs();
                //IPEndPoint endpoint = null;
                //IPAddress address = string.IsNullOrWhiteSpace(f_LocalIP) ? IPAddress.Any : IPAddress.Parse(f_LocalIP);
                //endpoint = new IPEndPoint(address, f_ListenPort);
                localIps.ForEach((ip) =>
                {
                    UdpClient client = new UdpClient(new IPEndPoint(IPAddress.Parse(ip), f_ListenPort));
                    UDPClients.Add(client);
                    ITL.ParamsSettingTool.AppEnv.Singleton.UdpCount += 1;

                    //启动相应UdpClient Receive监控线程
                    RecvTask = new Task(() =>
                    {
                        this.UdpClientReceive(client);
                    }, TaskCreationOptions.LongRunning);
                    RecvTask.Start();
                });
            }
            catch (Exception e)
            {
                strErr = string.Format("UDP client create failed: {0}", e.Message);
                return(false);
            }
            IsOpen = true;
            return(true);
        }
        void StartToReadingData()
#endif
        {
            while (!IsDisposed)
            {
                try
                {
                    Console.WriteLine("start to read data...");
                    IPEndPoint sender = null;
                    byte[]     byffer = null;
#if (NETSTANDARD1_6 || NETCOREAPP1_1)
                    var data = await newsock.ReceiveAsync();

                    sender = data.RemoteEndPoint;
                    byffer = data.Buffer;
#else
                    byffer = newsock.Receive(ref sender);
#endif
                    Console.WriteLine("receive data : " + byffer.Length);
                    if (!ClientsByIp.ContainsKey(sender.Address.ToString()))
                    {
                        Console.WriteLine("not found client " + sender.Address.ToString() + " count: " + ClientsByIp.Count);
                        continue;
                    }

                    var clients = ClientsByIp[sender.Address.ToString()];
                    foreach (var item in clients)
                    {
                        if (!UDPClients.ContainsKey(item))
                        {
                            UDPClients.TryAdd(item, new BlockingCollection <byte[]>());
                            //start engine
                            CreateNewEngine(item);
                        }
                        item.UdpIp = sender;
                    }
                    if (byffer.Length == 1)
                    {
                        Console.WriteLine("client connected: " + sender.Address.ToString());
                        continue;
                    }
                    foreach (var item in UDPClients)
                    {
                        if (item.Key.IPAddress == sender.Address.ToString())
                        {
                            continue;
                        }
                        bool isAdd = UDPClients[item.Key].TryAdd(byffer);
                        if (!isAdd)
                        {
                            Console.WriteLine("cannot tryAdd to client");
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
        }
 /// <summary>
 /// 停止Udp监听
 /// </summary>
 public void StopUdp()
 {
     IsStop = true;
     IsOpen = false;
     UDPClients?.ForEach((udp) =>
     {
         udp.Client.Shutdown(SocketShutdown.Both);
         udp.Close();
     });
     UDPClients.Clear();
     RecvTask = null;
 }