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)) { //lock for thread-safety, otherwise the dupe check below may not be sound lock (instances) { //search by MachineName and Fingerprint - these are unique while IP address may not be //reasoning - the same machine may have multiple IP addresses as discovery supports multiple interfaces if (!instances.Any(i => i.MachineName.Equals(packet.MachineName) && (i.Fingerprint == packet.Fingerprint))) { Data.Instance instance = new Data.Instance { IpAddress = source.Address.ToString(), MachineName = packet.MachineName, Fingerprint = packet.Fingerprint }; 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) { //search by MachineName and Fingerprint - these are unique while IP address may not be //reasoning - the same machine may have multiple IP addresses as discovery supports multiple interfaces Data.Instance instance = instances.SingleOrDefault(i => i.MachineName.Equals(packet.MachineName) && (i.Fingerprint == packet.Fingerprint)); if (instance != null) { instances.Remove(instance); if (InstanceOffline != null) { InstanceOffline(this, new InstanceChangedArgs { Instance = instance }); } } } } }
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 }); } } } } }
public static void Broadcast(string verb, int fingerprint) { Sender.Send(IPAddress.Broadcast, verb, fingerprint); }