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. FatMouse and Cheese 动态化搜索

    FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  2. HDU 5166 Missing number 简单数论

    Missing number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) [ ...

  3. [iOS]C语言技术视频-04-程序循环结构(while{})

    下载地址: 链接: http://pan.baidu.com/s/1o6imQ4U 密码: imuy

  4. 一、MongoDB安装及启动

    1 安装 在官网http://www.mongodb.org/downloads下载对应版本,并安装.安装在D:\MongoDB下. 2 设置 1) 新建文件夹,用于存放db数据 D:\MongoDB ...

  5. 现在开始使用 ES6

    ECMAScript已经在2015年6月正式发布了,这门语言一直保持稳定快速的发展而且新功能也在慢慢被现在主流的 JavaScript 引擎所接受.不过要想在浏览器端或者 Node 端直接运行 ES6 ...

  6. 在Windows环境下设置terminal下调试adb

    当我们想要查看某些程序运行的结果的时候.可能需要打开adb,输入相应的命令,在Windows环境下,需要配置环境变量. 当我们直接在Windows环境下输入adb shell,会提示adb是不内部命令 ...

  7. spring 5种通知

    方法实现接口 package com.cn.spring.aop.impl; //加减乘除的接口类 public interface ArithmeticCalculator { int add(in ...

  8. PHP访问接口获取数据

    如:http://localhost/operate.php?act=get_user_list&type=json 在这里operate.php相当于一个接口,其中get_user_list ...

  9. 使用DLL进行不同语言之间的调用(转)

    源:使用DLL进行不同语言之间的调用 __declspec(dllexport) 是告诉编译器用来导出函数的,在代码中不另作说明了. extern "C" 的意思就是用C的方式来导 ...

  10. iOS开发之指纹解锁

    http://blog.csdn.net/hongfengkt/article/details/49868073 前一阵子一直在赶项目进度,没有太多时间写博客,现在终于空闲了,将以前欠下的博客补上来. ...