v博客前言

先交代下背景,最近我们项目组的网络真是太渣了,时常remote不了另外一个地方的机器,过个几分钟就断开连接,太烦躁了,严重影响工作心情。。。于是想着做个工具记录下每天的断开remote连接的时刻,然后将这份记录给IT人员,让他们去分析分析到底哪里出问题了。到了第二个版本,我就将这个记录汇总成了一个Report,包含了与远程机器的累计失联次数,累计失联时间,最长失联时间,最长在线时间。将失联和重新建立连接的时间点打印在控制台窗口和log文件中。效果还不错。

开源项目地址:https://github.com/Jackson0714/PingTest

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地址

作  者:
Jackson0714

出  处:http://www.cnblogs.com/jackson0714/

关于作者:专注于微软平台的项目开发。如有问题或建议,请多多赐教!

版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信

声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是作者坚持原创和持续写作的最大动力!

我的小工具开源一下-PingTest的更多相关文章

  1. 【开源一个小工具】一键将网页内容推送到Kindle

    最近工作上稍微闲点,这一周利用下班时间写了一个小工具,其实功能挺简单但也小折腾了会. 工具名称:Simple Send to Kindle Github地址:https://github.com/zh ...

  2. 性能测试开源小工具——http_load介绍

    淘测试 性能测试开源小工具——http_load介绍 meizhu 发表于:2009-07-02 浏览:3552次 评论:1次 所属分类: 性能测试 性能测试开源小工具——http_load介绍 ht ...

  3. 开源小工具 酷狗、网易音乐缓存文件转mp3工具

    发布一个开源小工具,支持将酷狗和网易云音乐的缓存文件转码为MP3文件. 以前写过kgtemp文件转mp3工具,正好当前又有网易云音乐缓存文件需求,因此就在原来小工具的基础上做了一点修改,增加了对网易云 ...

  4. 开源一个IE下获取XPath小工具,支持32/64位

    背景是曾经友情支持了测试组一小段时间,发现他们使用selenium做页面的自动化测试,需要用到XPath,但IE下没有获取XPath的工具,只能在Firefox和chrome下获取,步骤还比较麻烦.而 ...

  5. 开源一个Mac漂亮的小工具 PPRows for Mac, 在Mac上优雅的计算你写了多少行代码

    开源一个Mac漂亮的小工具 PPRows for Mac, 在Mac上优雅的计算你写了多少行代码. 开源地址: https://github.com/jkpang/PPRows

  6. 时间都去哪儿了?开源一个统计iPhone上App运行时间和打开次数的小工具【iOS8已失效】

    如今,大家每天都有大量时间花在手机上,但是,大家有没有想过自己的时间都花在哪些App上了呢?相信很多人都有这样的需求,不过iOS系统本身并不能显示每个App的运行时间和次数,因此,本人写了这样一个小工 ...

  7. 【python】【开源】使用Tkinter和matplotlib实时显示图像,打造属于自己的性能测试小工具

    在腾讯的perfdog工具还未公开时,当时需要查看内存使用情况等信息,就用python写了个小工具 为了提升开发效率,就直接借用了雷子开源的性能测试工具的布局,自己美化了一下,然后加入了实时显示数据的 ...

  8. 访问github太慢?我写了一个开源小工具一键变快

    前言 GitHub应该是广大开发者最常去的站点,这里面有大量的优秀项目,是广大开发者寻找资源,交友学习的好地方.尤其是前段时间GitHub公布了一项代码存档计划--Arctic Code Vault, ...

  9. 开源一个自动整理B站UWP客户端软件进行批量下载的视频文件的小工具BiliVideosReoganizeHelper​

    ​ 大家都知道B站是一个很受欢迎的视频学习网站,上面有很多无私的up主上传了大量优秀的教学视频,在此向B站致敬,向广大UP主致敬. 有时,我们需要下载收藏一些视频,以防止以后找不到了.那么我们可以用B ...

随机推荐

  1. Properties 使用,注意编码

    private static void setConfig(){ try { // String path = System.getProperty("user.dir") + & ...

  2. ASP.NET MVC3中的路由系统(Routes) .

    MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control里对应的ActionMethod,由ActionMethod来决定返回用户什么样的信息.而把用户访问的地址对应到对应的 ...

  3. codis 新版本 CodisLabs 编译安装

    codis 3.0 版本编译安装 # 首先安装 go 语言 wget https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz ...

  4. 10、手把手教你Extjs5(十)自定义模块的设计

    从这一节开始我们来设计并完成一个自定义模块.我们先来确定一个独立的模块的所能定义的一些模块信息.以下信息只是我自己在开发过程中想到或用到的,希望有新的想法的或者有建议的跟贴回复. 一个独立模块包含以下 ...

  5. JavaScript 事件模型 事件处理机制

    什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...

  6. Qt下libusb-win32的使用方法(转)

    源:Qt下libusb-win32的使用方法 之前一直找不到适合WIN7下的Tiny6410的USB下载软件,正好这几天开始学习USB,所以打算自己写一个专门用于Tiny6410的WIN7下的USB下 ...

  7. Phone APP设计规范/iPad APP设计规范/Android APP设计规范/网页设计规范

    原文链接:http://www.ui001.com/chicun/ ①iPhone的设计尺寸 iPhone界面尺寸: 设备 分辨率 状态栏高度 导航栏高度 标签栏(工具栏)高度 iPhone6 plu ...

  8. CSS判断不同分辨率显示不同宽度布局CSS3技术支持IE6到IE8

    CSS判断不同分辨率浏览器(显示屏幕)显示不同宽度布局CSS3技术支持IE6到IE8.将用到css3 @media样式进行判断,但IE9以下版本不支持CSS3技术,这里DIVCSS5给大家介绍通过JS ...

  9. js执行js字符串函数的方法

    <script> var jsText = 'return function(){alert(1+1)}' var jscode = new Function(jsText)(); jsc ...

  10. C++中类的大小计算方法总结《网络+总结》

    C++中类的成员函数,静态成员是不占类的大小的.类的大小等于基类的大小+子类个non-static成员变量的大小再+非虚基类大小,如果有多态性还要考虑vptr(可能不止一个)大小,这里成员变量是会被字 ...