Exemple #1
0
        private void TimerKeepAlive_Tick(object sender, EventArgs e)
        {
            var toDelete = new List <IPAddress>();

            foreach (var address in connectedMotes.Keys)
            {
                var ts = DateTime.Now - connectedMotes[address].latestData;
                if (ts.TotalSeconds > 1.0)
                {
                    toDelete.Add(address);
                    Console.WriteLine("LOST UDPMOTE");
                    UdpmoteDisconnected?.Invoke(connectedMotes[address]);
                }
                else
                {
                    //Console.WriteLine("ALIVE " + address.ToString());
                    byte[] buffer = Encoding.UTF8.GetBytes("KEEPALIVE#" + System.Environment.MachineName + "#" + connectedMotes[address].num.ToString());
                    _socketBC.SendTo(buffer, new IPEndPoint(address, portAnswerBC));
                    Console.WriteLine("SENDED KEEPALIVE: " + buffer.Length.ToString());
                }
            }
            foreach (var address in toDelete)
            {
                connectedMotes.Remove(address);
                ConnectedUdpmotesChanged?.Invoke(connectedMotes);
            }
        }
Exemple #2
0
        private void ReceiveData(IAsyncResult data)
        {
            if (_socket == null)
            {
                return;
            }
            try
            {
                State so = (State)data.AsyncState;

                int bytes = _socket.EndReceiveFrom(data, ref epFrom);
                if (bytes != 27)
                {
                    throw new ArgumentOutOfRangeException();
                }

                var remoteIP = ((IPEndPoint)epFrom).Address;

                if (availableMotes.ContainsKey(remoteIP))
                {
                    if (availableMotes[remoteIP].latestData == DateTime.MinValue)
                    {
                        connectedMotes[remoteIP] = availableMotes[remoteIP];
                        ConnectedUdpmotesChanged?.Invoke(connectedMotes);
                        availableMotes.Remove(remoteIP);

                        connectedMotes[remoteIP].latestData = DateTime.Now;
                        UdpmoteConnected?.Invoke(connectedMotes[remoteIP]);
                    }
                }

                if (connectedMotes.ContainsKey(remoteIP))
                {
                    connectedMotes[remoteIP].latestData = DateTime.Now;
                    UdpmoteChanged?.Invoke(new UdpmoteState(so.buffer));
                }
                else
                {
                    Console.WriteLine("ERROR: Unknown UDPmote! " + remoteIP.ToString());
                }

                _socket.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFrom, ReceiveData, so);
            }
            catch (ObjectDisposedException)
            {
            }
        }