///<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); } }
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; } }