예제 #1
0
    public static void Ping(string host, float timeOut = 4f, int pingTimes = 4, Action <string, PingStatistics> resultCallBack = null)
    {
        StringBuilder builder = new StringBuilder();

        builder.Append("Start Ping " + host + "\n");
        UnityPing.CreatePing(host, (res) =>
        {
            string stateInfo = res.isSuccess ? "Success" : res.errorReason.ToString();
            builder.Append("return:" + stateInfo + " time:" + res.pingTime + "\n");
        }, OnComplete: (pingResults) =>
        {
            int passTimes     = 0;
            int maxTime       = 0;
            int minTime       = -1;
            int allTime       = 0;
            int caculateTimes = 0;

            string ip = "";
            foreach (var item in pingResults)
            {
                ip = item.ip;
                if (item.isSuccess)
                {
                    passTimes++;
                    if (maxTime < item.pingTime)
                    {
                        maxTime = item.pingTime;
                    }
                    if (minTime == -1)
                    {
                        minTime = item.pingTime;
                    }
                    if (minTime > item.pingTime)
                    {
                        minTime = item.pingTime;
                    }
                    allTime += item.pingTime;
                    caculateTimes++;
                }
            }
            int averagePingTime       = caculateTimes == 0? 0:(allTime / caculateTimes);
            PingStatistics statistics = new PingStatistics(host, ip, pingResults.Length, passTimes, maxTime, minTime, averagePingTime);
            builder.Append("Ping Times:" + statistics.pingTimes + " Pass Times:" + statistics.pingPass + "\n");

            if (passTimes > 0)
            {
                builder.Append("Min Ping:" + statistics.minPingTime + "ms Max Ping:" + statistics.maxPingTime + "ms AVG:" + statistics.averagePingTime + "\n");
            }
            if (resultCallBack != null)
            {
                resultCallBack(builder.ToString(), statistics);
            }
            else
            {
                Debug.Log(builder);
            }
        }, timeOut: timeOut, runTimes: pingTimes);
    }
예제 #2
0
        public void ComputeMedian_OddSet_isEqual20()
        {
            //Arrange
            var pingstat = new PingStatistics();
            //Act
            var result = pingstat.ComputeMedian(this.oddset);

            //Assert
            Assert.AreEqual(20, result);
        }
예제 #3
0
        public void IdentifyUnique_OddSet_IsEqualtoEvenSet()
        {
            //Arrange
            var pingstat = new PingStatistics();
            //Act
            var result = pingstat.IdentifyUnique(this.oddset);

            //Assert
            CollectionAssert.AreEqual(this.evenset, result);
        }
예제 #4
0
        public void ComputeMedian_EvenSet_isEqual30()
        {
            //Arrange
            var pingstat = new PingStatistics();
            //Act
            var result = pingstat.ComputeMedian(this.evenset);

            //Assert
            Assert.AreEqual(30, result);
        }
예제 #5
0
        public void IdentifyThirdQuartile_EvenSet_IsEqualto10()
        {
            //Arrange
            var pingstat = new PingStatistics();
            //Act
            var result = pingstat.IdentifyThirdQuartile(this.evenset);

            //Assert
            Assert.AreEqual(40, result);
        }
예제 #6
0
        public void ComputeStdDeviation_EvenSet_IsEqualto250()
        {
            //Arrange
            var pingstat = new PingStatistics();
            //Act
            var result = pingstat.ComputeStdDeviation(this.evenset);

            //Assert
            Assert.AreEqual(15.81, Math.Round(result, 2));
        }
예제 #7
0
        public void ComputeVariance_EvenSet_IsEqualto250()
        {
            //Arrange
            var pingstat = new PingStatistics();
            //Act
            var result = pingstat.ComputeVariance(this.evenset);

            //Assert
            Assert.AreEqual(250, result);
        }
예제 #8
0
        public void ComputeVariance_OddSet_IsEqualto264()
        {
            //Arrange
            var pingstat = new PingStatistics();
            //Act
            var result = pingstat.ComputeVariance(this.oddset);

            //Assert
            Assert.AreEqual(264, result);
        }
예제 #9
0
        private PingStatistics CalculatePingStatistics(List <PingReply> repies)
        {
            var            roundTrips = repies.Select(x => x.RoundtripTime).ToList();
            PingStatistics statistics = new PingStatistics(
                repies.Select(x => x.ConvertToPingResult()).ToList(),
                (repies.Count(x => x.Status == IPStatus.Success) / repies.Count) * 100,
                (int)Enumerable.Max(roundTrips),
                (int)Enumerable.Min(roundTrips),
                (int)Math.Floor(Enumerable.Average(roundTrips)));

            return(statistics);
        }
예제 #10
0
    private static void SelectPingResult(List <PingStatistics> pingStatistics, Action <PingStatistics> resultCallBack)
    {
        if (pingStatistics.Count <= 1)
        {
            if (pingStatistics.Count == 0)
            {
                if (resultCallBack != null)
                {
                    resultCallBack(default(PingStatistics));
                }
            }
            else
            {
                if (resultCallBack != null)
                {
                    resultCallBack(pingStatistics[0]);
                }
            }
        }
        else
        {
            List <PingStatistics> tempStatistics = new List <PingStatistics>();
            //选取ping通率在50%及以上的
            foreach (var ss in pingStatistics)
            {
                if (ss.pingPass * 1f / ss.pingTimes >= 0.5f)
                {
                    tempStatistics.Add(ss);
                }
            }

            if (tempStatistics.Count == 0)
            {
                tempStatistics.AddRange(pingStatistics);
            }
            //选取平均Ping最少的
            PingStatistics minPing = tempStatistics[0];
            foreach (var ss in tempStatistics)
            {
                if (ss.averagePingTime < minPing.averagePingTime && ss.pingPass > 0)
                {
                    minPing = ss;
                }
            }
            if (resultCallBack != null)
            {
                resultCallBack(minPing);
            }
        }
    }
예제 #11
0
        private void _pinger_StatisticsUpdated
        (
            object sender,
            EventArgs e
        )
        {
            PingStatistics statistics = _pinger.Statistics;

            if (statistics.Data.Count > 1500)
            {
                while (statistics.Data.Count > 1000)
                {
                    statistics.Data.Dequeue();
                }
            }

            _plotter.Invalidate();
        }