static void Save_log(net_state snapshot) { if (WRITE_CSV) // Если запись логов включена { String rtts = ""; int avg_rtt = 0; foreach (var ci in PING_HOSTS) { rtts += $"{snapshot.avg_rtts[ci]};"; avg_rtt += snapshot.avg_rtts[ci]; } avg_rtt = avg_rtt / PING_HOSTS.Count; File.AppendAllText(OUT_FILE, CSV_PATTERN .Replace("FTIME", snapshot.measure_time.ToShortDateString()) .Replace("IUP", snapshot.inet_ok.ToString()) .Replace("AVGRTT", avg_rtt.ToString()) .Replace("ROUTERRTT", snapshot.router_rtt.ToString()) .Replace("LOSS", snapshot.packet_loss.ToString()) .Replace("HTTP", snapshot.http_ok.ToString()) .Replace("STIME", snapshot.measure_time.ToShortTimeString()) .Replace("RN", $"{rtts}\r\n")); } }
static void Monit() { // Создаем экземпляр измерений. net_state snapshot = new net_state(); snapshot.inet_ok = true; snapshot.measure_time = DateTime.Now; // Проверяем доступность роутера Ping ping = new Ping(); var prr = ping.Send(ROUTER_IP, PING_TIMEOUT); // В CSV файле все поля должны быть заполнены. Если роутер не пингуестся заполняем их параметром PING_TIMEOUT snapshot.router_rtt = prr.Status == IPStatus.Success ? (int)prr.RoundtripTime : PING_TIMEOUT; if (prr.Status != IPStatus.Success) { snapshot.avg_rtts = new Dictionary <string, int>(); snapshot.http_ok = false; snapshot.inet_ok = false; snapshot.packet_loss = 1; foreach (var ci in PING_HOSTS) { snapshot.avg_rtts.Add(ci, PING_TIMEOUT); } Console.WriteLine("Router was unreachable."); Save_log(snapshot); return; } snapshot.inet_ok = true; // Проверяем доступность HTTP try { snapshot.http_ok = true; TcpClient tc = new TcpClient(); tc.BeginConnect(HTTP_TEST_HOST, HTTP_TEST_PORT, null, null); Thread.Sleep(HTTP_TIMEOUT); // Если подключиться не удалось if (!tc.Connected) { snapshot.http_ok = false; } tc.Dispose(); } catch { snapshot.http_ok = false; snapshot.inet_ok = false; } //Теперь пингуем заданые хосты exited_threads = 0; pkt_sent = 0; success_pkts = 0; total_time = 0; measure_results = new Dictionary <string, int>(); // Перебираем все хосты и запускаем пинг в отдельном потоке. foreach (var ci in PING_HOSTS) { Thread thread = new Thread(new ParameterizedThreadStart(PingTest)); thread.Start(ci); } while (exited_threads < PING_HOSTS.Count) { continue; } //Анализируем результаты пинга snapshot.avg_rtts = measure_results; snapshot.packet_loss = (double)(pkt_sent - success_pkts) / pkt_sent; snapshot.inet_ok = !( snapshot.http_ok == false || ((double)total_time / success_pkts >= 0.75 * PING_TIMEOUT) || snapshot.packet_loss >= MAX_PKT_LOSS || snapshot.router_rtt == PING_TIMEOUT); Save_log(snapshot); if (prev_inet_ok && !snapshot.inet_ok) { //Интернет был , но теперь неудачу prev_inet_ok = false; first_fail_time = DateTime.Now; } else if (!prev_inet_ok && snapshot.inet_ok) { String t_s = new TimeSpan(DateTime.Now.Ticks - first_fail_time.Ticks).ToString(@"hh\:mm\:ss"); prev_inet_ok = true; } }