我的小工具開源一下-PingTest
先交代下背景,最近我們項目組的網絡真是太渣了,時常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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!