コード例 #1
0
ファイル: Listener.cs プロジェクト: hoanvls/MultiMiner
        private void ProcessReceived(IPEndPoint source, byte[] bytes)
        {
            //only response to discovery on the local network since we transfer fingerprints
            if ((source.AddressFamily != AddressFamily.InterNetwork) &&
                (source.AddressFamily != AddressFamily.InterNetworkV6))
            {
                return;
            }

            string jsonData = Encoding.ASCII.GetString(bytes);

            JavaScriptSerializer serializer = new JavaScriptSerializer();

            Data.Packet packet = serializer.Deserialize <Data.Packet>(jsonData);

            if (packet.Verb.Equals(Verbs.Online))
            {
                string ipAddress = source.Address.ToString();
                if (!instances.Any(i => i.IpAddress.Equals(ipAddress)))
                {
                    Data.Instance instance = new Data.Instance
                    {
                        IpAddress   = ipAddress,
                        MachineName = packet.MachineName,
                        Fingerprint = packet.Fingerprint
                    };

                    //lock for thread-safety - collection may be modified
                    lock (instances)
                    {
                        instances.Add(instance);
                    }

                    Sender.Send(source.Address, Verbs.Online, fingerprint);

                    if (InstanceOnline != null)
                    {
                        InstanceOnline(this, new InstanceChangedArgs {
                            Instance = instance
                        });
                    }
                }
            }
            else if (packet.Verb.Equals(Verbs.Offline))
            {
                string ipAddress = source.Address.ToString();

                //lock for thread-safety - collection may be modified
                lock (instances)
                {
                    Data.Instance instance = instances.SingleOrDefault(i => i.IpAddress.Equals(ipAddress));
                    if (instance != null)
                    {
                        instances.Remove(instance);

                        if (InstanceOffline != null)
                        {
                            InstanceOffline(this, new InstanceChangedArgs {
                                Instance = instance
                            });
                        }
                    }
                }
            }
        }