public static void HandShakeHandler(PacketHeader packetheader, Connection connection, AndroidInfo ad) { var device = AndroidDevice.Cache.FirstOrDefault(x => x.IP == ad.IP); if (device == null) { device = new AndroidDevice(); } device.IP = ad.IP; device.Port = ad.Port; device.DeviceId = ad.DeviceId; device.MAC = ad.MAC; device.Model = ad.Model; device.SIM = ad.Sim; device.Save(); var localEPs = Connection.AllExistingLocalListenEndPoints(); var serverInfo = new ServerInfo(Environment.MachineName); var ip = new IPEndPoint(IPAddress.Parse(ad.IP), ad.Port); foreach (var localEP in localEPs[ConnectionType.UDP]) { var lEp = localEP as IPEndPoint; if (lEp == null) { continue; } if (!ip.Address.IsInSameSubnet(lEp.Address)) { continue; } serverInfo.IP = lEp.Address.ToString(); serverInfo.Port = lEp.Port; serverInfo.Send(ip); break; } }
public static async void HandShakeHandler(PacketHeader packetheader, Connection connection, EndPointInfo ep) { lock (_clientsLock) _handshakeTasks.Enqueue(new Task(async() => { //Get known client or create new one. // Client client = null; // lock (_clients) // { var client = Client.Cache.FirstOrDefault(x => x.IP == ep.IP); if (client == null) { client = new Client() { IP = ep.IP }; } // } client.Hostname = ep.Hostname; client.Port = ep.Port; client.LastHeartBeat = DateTime.Now; var isNew = client.Id == 0; await client.SaveAsync(); client.IsOnline = true; StartPinger(client); if (isNew) { TerminalLog.Add(client.Id, "Encoder terminal added."); } TerminalLog.Add(client.Id, "Terminal has connected."); var localEPs = Connection.AllExistingLocalListenEndPoints(); var serverInfo = new ServerInfo(Environment.MachineName); var ip = new IPEndPoint(IPAddress.Parse(ep.IP), ep.Port); foreach (var localEP in localEPs[ConnectionType.UDP]) { var lEp = localEP as IPEndPoint; if (lEp == null) { continue; } if (lEp.AddressFamily != AddressFamily.InterNetwork) { continue; } if (!ip.Address.IsInSameSubnet(lEp.Address)) { continue; } serverInfo.IP = lEp.Address.ToString(); serverInfo.Port = lEp.Port; await serverInfo.Send(ip); break; } await SendEncoderUpdates(Client.Cache.ToList()); await TaskEx.Delay(100); })); if (_handshakeTasksRunning) { return; } _handshakeTasksRunning = true; await Task.Factory.StartNew(() => { while (true) { Task task = null; lock (_clientsLock) { if (_handshakeTasks.Count == 0) { break; } task = _handshakeTasks.Dequeue(); if (task == null) { continue; } task.Start(); task.Wait(); } } _handshakeTasksRunning = false; }); }