/// <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; }