using NLog; using System; using System.Collections.Generic; using System.Net.Sockets; using System.Text; using System.Threading; namespace ESPServer { class UnitPinger { const int PING_INTERVAL = 30 * 1000; // 30 seconds const int UNIT_TARGET_PORT = 7000; private readonly Logger logger = LogManager.GetCurrentClassLogger(); UnitsDatabase db; public UnitPinger(UnitsDatabase db) { this.db = db; } public void Start() { var t = new Thread(new ThreadStart(this.Run)); t.Start(); } private void Run() { logger.Info("Started UnitPinger"); while (true) { try { Thread.Sleep(PING_INTERVAL); var ips = db.GetUnitIPs(); foreach (var kv in ips) { var ip = kv.Value; using (var udpClient = new UdpClient()) { udpClient.Connect(ip, UNIT_TARGET_PORT); var data = Encoding.ASCII.GetBytes("ping"); udpClient.Send(data, data.Length); udpClient.Close(); } } } catch (Exception e) { logger.Error(e.Message); } } } } }