我的小工具開源一下-PingTest

czxs2000 7年前發布 | 77K 次閱讀 開源 統計分析 .NET開發

先交代下背景,最近我們項目組的網絡真是太渣了,時常remote不了另外一個地方的機器,過個幾分鐘就斷開連接,太煩躁了,嚴重影響工作心情。。。于是想著做個工具記錄下每天的斷開remote連接的時刻,然后將這份記錄給IT人員,讓他們去分析分析到底哪里出問題了。到了第二個版本,我就將這個記錄匯總成了一個Report,包含了與遠程機器的累計失聯次數,累計失聯時間,最長失聯時間,最長在線時間。將失聯和重新建立連接的時間點打印在控制臺窗口和log文件中。效果還不錯。

1.項目結構:

2.結果展示:

Consel窗口

Log文件:

3.原理

1.檢測的原理

1.1 用兩個后臺線程不斷的去ping另外一臺機器的IP地址,其中一個線程檢測是否可以連接,如果可以連接,則記錄時間點及狀態,另外一個線程檢測是否可以連接,如果不能連接,則retry ,如果連續retry 3次都不能ping通,則表示該機器失聯,記錄這次失聯的時間點。

ping的代碼:

public static bool Ping(string ip)
        {
            options.DontFragment = true;
            byte[] buffer = Encoding.ASCII.GetBytes(data);
            reply = p.Send(ip, timeout, buffer, options);
            if (reply.Status == System.Net.NetworkInformation.IPStatus.Success)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

1.2 兩個線程去檢測機器連接狀態:

public static void TestTargetIP1Connecting()
        {
            while (true)
            {
                if (targetIP1lastStatus != NetworkStatus.Online)
                {
                    pingTarget1Count++;
                    if (PingUtil.IsConnected(targetIP1))
                    {
                        timePoints1.Add(new TimePoint(DateTime.Now, NetworkStatus.Online));
                        targetIP1lastStatus = NetworkStatus.Online;
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine(FormatConnectingConsoleLog(targetIP1, pingTarget1Count));
                        Console.ForegroundColor = ConsoleColor.White;
                        log1.Info(FormatConnectingFileLog(targetIP1, pingTarget1Count));
                    }
                }
                Thread.Sleep(sleepTime);
            }
        }


        public static void TestTargetIP1Disconnected()
        {
            while (true)
            {
                if (targetIP1lastStatus != NetworkStatus.Offline && !PingUtil.IsConnected(targetIP1))
                {
                    timePoints1.Add(new TimePoint(DateTime.Now, NetworkStatus.Offline));

                    pingTarget1Count = 0;
                    targetIP1GroupCount++;

                    targetIP1lastStatus = NetworkStatus.Offline;
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine(FormatDisconnectedConsoleLog(targetIP1, targetIP1GroupCount));
                    Console.ForegroundColor = ConsoleColor.White;
                    log1.Info(FormatDisconnectedFileLog(targetIP1, targetIP1GroupCount));
                }
                Thread.Sleep(sleepTime);
            }
        }

1.3 retry的機制

public static bool IsConnected(string ipAddress)
        {
            bool isConnected = true;
            try
            {
                RetryScope.BeginRetry(retryInterval);
                do
                {
                    try
                    {
                        try
                        {
                            if (!PingUtil.Ping(ipAddress))
                            {
                                throw new Exception(string.Format("{0} Disconnected", ipAddress), new Exception("Disconnected"));
                            }
                        }
                        finally
                        {

                        }
                        break;
                    }
                    catch (Exception ex)
                    {
                        if (!RetryScope.HandleException(ex))
                        {
                            throw;
                        }
                    }
                } while (RetryScope.Continue);

            }
            catch (Exception cex)
            {
                isConnected = false;
            }

            finally
            {
                RetryScope.EndRetry(retryInterval);
            }
            return isConnected;
        }

2.對所有時間點進行分析

2.1 統計分析的核心代碼。發現用Linq超級爽,一下子就統計分析出來了。

2.2 單元測試:

因為每次統計分析都需要手動連網或斷網來測試,所以寫了這部分的單元測試。

3.生成Report

一個打印到Console窗口的類:ConsoleReport.cs

一個記錄到Log4Net的日志文件中的類LogFileReport.cs

這兩個類繼承接口IExport.cs。

4.Log4Net的使用

Log4Net的配置文件

記錄日志:

5.支持配置IP地址

 

 

 本文由用戶 czxs2000 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!