Ejemplo n.º 1
0
 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"));
     }
 }
Ejemplo n.º 2
0
        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;
            }
        }