Exemple #1
0
        ///<summary>
        ///запускает программу проверки ping
        ///</summary>
        private static void DoMeasures()
        {
            System.Timers.Timer _timer = new System.Timers.Timer();
            _timer.AutoReset = true;
            _timer.Interval  = MEASURE_DELAY;
            _timer.Elapsed  += delegate
            {
                if (!locker)
                {
                    net_state snapshot = new net_state();
                    snapshot.inet_ok      = true;
                    snapshot.measure_id   = start_measure_id++;
                    snapshot.measure_time = DateTime.Now;
                    Ping ping = new Ping();
                    //Первая проверка если роутер активен
                    var prr = ping.Send(ROUTER_IP, 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);
                        }
                        locker = true;
                        MethodInvoker methodInvoker = delegate()
                        {
                            _uI.ChangeStateControllsButtons();
                        };
                        _uI.Invoke(methodInvoker);

                        WriteLog("Router was unreachable.");
                        _timer.Stop();
                        return;


                        //SaveSnapshot(snapshot);
                        if (prev_inet_ok)
                        {
                            //Нет доступа к интернету
                            prev_inet_ok    = false;
                            first_fail_time = DateTime.Now;
                        }

                        return;
                    }

                    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; }
                    //Now do ping test
                    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(PerformPingTest));
                        thread.Start(ci);
                    }
                    while (exited_threads < PING_HOSTS.Count)
                    {
                        continue;
                    }
                    //Analyze results
                    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);
                    SaveSnapshot(snapshot);
                }
                else
                {
                    _timer.Stop();
                }
            };
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
            httpc = new HttpClient();
            _timer.Start();
            if (locker)
            {
                return;
            }
            while (true)
            {
                Thread.Sleep(1000000);
            }
        }
Exemple #2
0
        static void SaveSnapshot(net_state snapshot)
        {
            if (!locker)
            {
                //среднее значение ртт
                int avg_rtt = 0;
                //максимальное значение ртт
                int max_rtt = 0;
                //среднее значение ртт внутри локальной сети
                int avg_rtt_local = 0;


                List <string> vs = new List <string>();
                //т.к пингует отдельный поток чтобы UI не завис, нам необходим делегат , который позволит общаться между потоками
                MethodInvoker methodInvoker = delegate()
                {
                    if (_uI.IpArray.Rows.Count > 0)
                    {
                        foreach (DataGridViewRow row in _uI.IpArray.Rows)
                        {
                            int res;
                            int.TryParse((row.Cells[0].Value.ToString()), out res);
                            avg_rtt += res;
                        }
                        avg_rtt = avg_rtt / _uI.IpArray.Rows.Count;
                    }
                    var index = _uI.IpArray.Rows.Add();

                    for (int i = 0; i < _uI.IpArray.Columns.Count; i++)
                    {
                        _uI.IpArray.Rows[index].Cells[i].Value = snapshot.avg_rtts[_uI.IpArray.Columns[i].Name];
                    }
                    _uI.Status.MaxPing = _uI.Status.MaxPing > max_rtt ? _uI.Status.MaxPing : max_rtt;

                    for (int i = 1; i < PING_HOSTS.Count; i++)
                    {
                        avg_rtt_local += snapshot.avg_rtts[PING_HOSTS[i]];
                    }
                    _uI.Chart.UpdateChart(snapshot.measure_time.ToString(), snapshot.avg_rtts[PING_HOSTS[0]]);

                    _uI.Status.AvgPing       = avg_rtt;
                    _uI.Status.CountMembers  = PING_HOSTS.Count - 1;
                    _uI.Status.IntenetStatus = snapshot.inet_ok;
                    if ((avg_rtt_local / PING_HOSTS.Count - 1) < 1)
                    {
                        _uI.Status.NetworkStatus = "Good";
                    }
                    else
                    {
                        _uI.Status.NetworkStatus = "Bad";
                        WriteLog("Плохое соеденение в локальной сети");
                    }
                    _uI.UpdateStatusSummary();
                };
                //invoke отправляет делегат родительскому потоку
                _uI.Invoke(methodInvoker);
            }
            else
            {
                return;
            }
        }