Получение случайной постоянной потери пакетов

Приведенный ниже код — это то, что я использую для проверки связи с 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% случаев!

Еще раз Это происходит, когда я делаю паузу и запускаю его снова быстро или несколько раз, когда я запускаю его в первый раз.


person Sina M.Azad    schedule 10.02.2017    source источник
comment
Пинг не является окончательным ответом на все вопросы — пинг имеет низкий сетевой приоритет, поэтому да, пинг может сообщать о потере пакетов, когда их нет… однако это указывает на другие проблемы.   -  person BugFinder    schedule 10.02.2017
comment
Но с помощью CMD, Powershell и Pingplotter я не вижу такой проблемы, и мне нужно ее исправить, чтобы сделать приложение пригодным для использования.   -  person Sina M.Azad    schedule 10.02.2017
comment
Вы уверены, что не получаете исключение - вы молча их подавляете.   -  person RB.    schedule 10.02.2017
comment
Я бы также поместил Debug.Writeline("Exception in Ping") в ваш пустой блок catch, потому что в настоящее время вы понятия не имеете, когда возникает исключение, и это приведет к потере...   -  person Martin Verjans    schedule 10.02.2017
comment
Проблема осталась, добавлено: catch (ошибка PingException) { MessageBox.Show(error.Message); }   -  person Sina M.Azad    schedule 10.02.2017
comment
@SinaM.Azad Для чего именно вам это нужно?   -  person FCin    schedule 10.02.2017
comment
Просто хочу написать приложение с графиком и другими вещами для мониторинга сети. это должно быть основой. @FCin   -  person Sina M.Azad    schedule 10.02.2017


Ответы (1)


Я проверил ваш код и получил те же проблемы. Затем я протестировал ping 8.8.8.8 -t -w 900 из cmd, который обычно сообщает 35 мс (так же, как ваш код), но также иногда время от времени показывает тайм-аут.

Я думаю, что установленное значение тайм-аута измеряется с момента отправки запроса в сетевую службу до получения ответа. Если служба занята, 900 мс может быть недостаточно, даже если фактический пинг будет возможен менее чем за 900 мс.

(не ответ, а жажда комментария)

введите здесь описание изображения

person dognose    schedule 10.02.2017
comment
Спасибо, что уделили этому время, я не уверен, упоминал ли я, что я не теряю 1 или 2 пакета, это похоже на постоянную потерю пакетов, пока я не приостановлю и не начну снова, у вас была такая же проблема? @dognose - person Sina M.Azad; 10.02.2017
comment
@SinaM.Azad Иногда. В большинстве случаев это было 4-5 проигрышей, потом 4-5 хороших, потом снова проигрышей. - person dognose; 10.02.2017