获得随机恒定数据包丢失

时间:2017-02-10 09:37:17

标签: c# ping packet-loss

下面的代码就是我用来ping 8.8.8.8的代码,但有些时候我按下启动它只是数据包丢失,这很重要,这很奇怪,因为我确信我没有那么多数据包丢失,然后我暂停它并重新开始它工作正常,对我来说没有意义,我不知所措。

我添加了Thread.Sleep();因为我猜想当我启动程序时可能没有加载程序,但这也很奇怪!它是一个如此小而简单的程序,它不应该有这样的问题

我还有一个问题,我应该为此付出多长时间,现在应用程序每秒发送一个数据包,并且每900毫秒丢弃一次,如果我把它高于900或者会降低性能?

public partial class Form1 : Form
{
    public int PingTime;
    public int pingor = 0;
    public int pingur = 0;
    public int maxping;
    public int minping;
    public Int64 avgping;
    public string avrage;
    public int ping_no;
    public string fail;
    public string msg1 = " Packet Lost ";

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (timer1.Enabled == true )
        {
            timer1.Enabled = false;
            Thread.Sleep(1000);
        }
        else if (timer1.Enabled == false)
        {
            timer1.Enabled = true;
            Thread.Sleep(1000);
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {         
        bool pingable = false;

        PingOptions options = new PingOptions();
        options.DontFragment = true;
        string data = "1";
        byte[] buffer = Encoding.ASCII.GetBytes(data);

        Ping pinger = new Ping();
        try
        {
            //37.58.117.146
            //8.8.8.8
            PingReply reply = pinger.Send("8.8.8.8", 900, buffer, options);
            pingable = reply.Status == IPStatus.Success;
            string pingtime = reply.RoundtripTime.ToString();
            int newpingtime = Convert.ToInt32(pingtime);

            if (reply.Status == IPStatus.Success)
            {
                label1.Text = reply.RoundtripTime.ToString();
            }
            else
            {
                label1.Text = msg1;
            }

            //_________________________Max Ping

            if (maxping == 0)
            {
                maxping = Convert.ToInt32(newpingtime);
            }
            else if (newpingtime >= Convert.ToInt32(maxping))
            {
                maxping = Convert.ToInt32(newpingtime);
            }
            lblmax.Text = maxping.ToString();

            //_________________________Min Ping

            if (reply.Status == IPStatus.Success && minping == 0 && newpingtime == 0)
            {
                lblmin.Text = minping.ToString();
            }
            else if (reply.Status == IPStatus.Success && lblmin.Text == " - - -" && newpingtime >= 0)
            {
                minping = newpingtime;
                lblmin.Text = minping.ToString();
            }

            else if (reply.Status == IPStatus.Success && newpingtime < minping)
            {
                minping = newpingtime;
                lblmin.Text = minping.ToString();
            }

            //_________________________Ping AVG

            if (reply.Status == IPStatus.Success)
            {
                avgping = avgping + newpingtime;
                ping_no = ping_no + 1;
                lblavg.Text = Convert.ToString(avgping / ping_no);
            }
        }
        catch (PingException error)
        {
            MessageBox.Show(error.Message);
        }

        if (pingable == true)
        {
            pingor++;
        }

        if (pingable == false)
        {
            pingur++;
        }

        lblrecived.Text = Convert.ToString(pingor);
        lbllost.Text = Convert.ToString(pingur);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        Thread.Sleep(900);
    }

在此先感谢,让您知道我没有超过2%的数据包丢失,这不应该显示40个数据包丢失和0收到!它的工作时间也很好80%!

再一次当我暂停并再次快速启动它或第一次启动它时会发生这种情况。

1 个答案:

答案 0 :(得分:0)

我测试了你的代码并遇到了同样的问题。然后我测试了cmd中的ping 8.8.8.8 -t -w 900,它通常报告35ms(与您的代码相同),但有时也会偶尔显示超时。

我认为超时值集是从请求发送到网络服务的时间开始计算的,直到收到答复为止。如果服务繁忙,900ms可能不够,即使实际ping可能在900ms以下。

(不是答案,但渴望发表评论)

enter image description here