using SafeMobileLib; using SDRGatewayService.Enums; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net.NetworkInformation; using System.Text; using System.Threading; using System.Threading.Tasks; namespace SDRGatewayService { class PingThread { string ip; private int interval; bool status; private Thread t_Ping; /// /// ping class /// /// dest IP /// interval for pings in seconds public PingThread(string ip, int interval) { this.ip = ip; this.interval = interval; status = false; t_Ping = new Thread(new ThreadStart(Worker)); t_Ping.IsBackground = true; t_Ping.Start(); } public void Worker() { Utils.WriteEventLog(Program.COMPANY, String.Format("PingThread started for " + ip + " interval:" + interval), EventLogEntryType.Information, (int)EventId.EVENT_PING); int count = 0; while (true) { try { Thread.Sleep(ConfigHelper.SdrPing * 1000); DateTime time = DateTime.Now; //SM.Debug(ip + " ping sent!"); Ping pingSender = new Ping(); PingReply pReply = pingSender.Send(ip); if (pReply.Status == IPStatus.Success) { if (status == false) //going from OFF->ON OnNewPingComplete(true, ip); status = true; } else //if (pReply.Status == IPStatus.TimedOut) { if (status == true) //going from ON->OFF OnNewPingComplete(false, ip); status = false; } if (count++ % 10 == 0) Utils.WriteEventLog(Program.COMPANY, String.Format("Gateway {0} is {1}", ip, (status ? "ONLINE" : "OFFLINE")), EventLogEntryType.Information, (int)EventId.EVENT_PING); //SM.Debug(ip + " ping delta:" + (DateTime.Now -time) + " status:" + status); } catch { Utils.WriteEventLog(Program.COMPANY, String.Format("***Could not ping: " +ip+" ***"), EventLogEntryType.Information, (int)EventId.EVENT_PING); } Thread.Sleep(interval); } } public delegate void NewPingCompleteDEl(bool status, string ip); public event NewPingCompleteDEl OnNewPingComplete; } }