示例#1
0
        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;
            }
        }
示例#2
0
        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;
            });
        }