Ejemplo n.º 1
0
        private void ReceiveBroadcast(IAsyncResult data)
        {
            if (_socketBC == null)
            {
                return;
            }
            try
            {
                State so = (State)data.AsyncState;

                int bytes = _socketBC.EndReceiveFrom(data, ref epFromBC);
                Console.WriteLine("RECEIVED BC: " + bytes.ToString());
                string name = Encoding.UTF8.GetString(so.buffer.ToList().GetRange(0, bytes).ToArray());
                //Console.WriteLine(name);

                // Console.WriteLine(bytes);
                bool hasChanged = false;
                var  remoteIP   = ((IPEndPoint)epFromBC).Address;
                if (availableMotes.ContainsKey(remoteIP))
                {
                    if (availableMotes[remoteIP].name != name)
                    {
                        hasChanged = true;
                        availableMotes[remoteIP].name = name;
                    }
                    availableMotes[remoteIP].latestBC   = DateTime.Now;
                    availableMotes[remoteIP].latestData = DateTime.MinValue;
                }
                else
                {
                    hasChanged = true;
                    availableMotes[remoteIP] = new UdpmoteInfo(remoteIP, name, FreeNumMote(availableMotes, connectedMotes), false, DateTime.Now, DateTime.MinValue);
                }

                if (hasChanged)
                {
                    AvailaibleUdpmotesChanged?.Invoke(availableMotes);
                }

                byte[] buffer = Encoding.UTF8.GetBytes("BC#" + System.Environment.MachineName + "#" + availableMotes[remoteIP].num.ToString());
                _socketBC.SendTo(buffer, new IPEndPoint(remoteIP, portAnswerBC));

                Console.WriteLine("SENDED ANSWER BC: " + buffer.Length.ToString());

                _socketBC.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFromBC, ReceiveBroadcast, so);
            }
            catch (ObjectDisposedException)
            {
            }
        }
Ejemplo n.º 2
0
        private void TimerCleanning_Tick(object sender, EventArgs e)
        {
            var toDelete = new List <IPAddress>();

            foreach (var address in availableMotes.Keys)
            {
                var ts = DateTime.Now - availableMotes[address].latestBC;
                if (ts.TotalSeconds > 1.0)
                {
                    toDelete.Add(address);
                }
            }
            foreach (var address in toDelete)
            {
                Console.WriteLine("REMOVED FROM BC LIST: " + address.ToString());
                availableMotes.Remove(address);
            }

            if (toDelete.Count > 0)
            {
                AvailaibleUdpmotesChanged?.Invoke(availableMotes);
            }
        }