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); } }
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) { } }