Avatar
martus9519
Člen
Avatar
martus9519:

Zdravím, mam na praxi úkol vytvořit program, kt. posílá velké množství velkých pingů(např 1000x10000B) hlavně za účelem měřit rychlost přenosu. Ze svého počítače zahlcuji pingem nějáký síťový prvek a admin na svém počítači sleduje jeho zatížení. Problém je, že když ping spustím, rychlost se vyšplhá až na nějákých 7MiB/s, ale během několika desítek pingů rychlost začne klesat až třeba na 1MiB/s. Neměl byste někdo nápad co s tím? Pingy posílám asynchroně. Za každou radu předem díky..

namespace Pingator_0._3
{
    public partial class Form1 : Form
    {
        int Velikost, timeout, pocet;
        int cntr, spr, spt, clk = 0;
        IPAddress IP;
        DateTime PRED, POT;
        Single tMax, tMin, tAvg = 0;
        Single cas, cass;
        AutoResetEvent resetEvent = new AutoResetEvent(false);


        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Text = "Pingator v0.3 2014"; // prvni vypis
            textBox2.Text = "10.1.0.2";           // def. IP adresa
            textBox3.Text = "10";                 // timeout
            textBox4.Text = "25";                 // opakovani
            textBox5.Text = "5000";               // velikost packetu
            textBox6.Text = "10";                 // sleep
            checkBox1.Checked = false;
        }
        private void button2_Click(object sender, EventArgs e)
        {
            Close();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            cntr = 0;
            spr = 0;
            spt = 0;
            clk = 0;
            textBox1.Text.Remove(0);
            textBox1.Text = string.Format("Pinguji {0} s packety {1}B\r\n", textBox2.Text, textBox5.Text );
            SendPing();

        }
        private void SendPing()
        {
            IP = IPAddress.Parse(textBox2.Text);
            Velikost = int.Parse(textBox5.Text);
            byte[] buffer = new byte[Velikost];
            pocet = int.Parse(textBox4.Text);
            timeout = int.Parse(textBox3.Text);
            int pauza = int.Parse(textBox6.Text);
            PingOptions PO = new PingOptions();
            PO.DontFragment=false;
            PO.Ttl=8;
            clk++;
            Ping PingSender = new Ping();

            if (Velikost > 65500)
            {
                textBox1.Text += "Velikost packetu upravena na 65500B \r\n";
            }

            PingSender.PingCompleted += new PingCompletedEventHandler(PingSender_Complete);

            PRED = DateTime.Now;
            PingSender.SendAsync(IP, timeout, buffer, PO, resetEvent);
            Thread.Sleep(pauza);
            POT = DateTime.Now;
        }
        private void PingSender_Complete(object Sender, PingCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                textBox1.Text += "Chyba";
                ((AutoResetEvent)e.UserState).Set();
            }
            else
            {
                PingReply pingResponse = e.Reply;
                ShowPingResults(pingResponse);
            }
        }
        private void ShowPingResults(PingReply PingResponse)
        {
            if (PingResponse == null)
            {
                textBox1.Text += "Nebyla přijata žádná odpověď\r\n";
                spt++;
                return;
            }
            else if (PingResponse.Status == IPStatus.Success)
            {
                cas = (POT.Ticks-PRED.Ticks)/10000;
                cass = (POT.Ticks - PRED.Ticks) % 10000;
                if (checkBox1.Checked == true)
                {
                    textBox1.Text += "#" + cntr + " Úspěšný ping na: " + PingResponse.Address.ToString() + "  " + cas + "," + cass + "ms" + "\r\n";

                }
                else
                {
                    textBox1.Text += "#" + cntr + " Úspěšný ping na: " + PingResponse.Address.ToString() + "\r\n";
                }
                spr++;
            }
            else
            {
                textBox1.Text += "Neuspěšný ping\r\n";
                spt++;
            }


            if (checkBox1.Checked == true)
            {
                if (cas > tMax)
                    tMax = cas;
                else
                {
                    if (cas < tMin)
                        tMin = cas;
                }
                tAvg += cass;
            }

            cntr++;
            if (cntr < pocet)
                SendPing();
            else
                Final();
        }
        private void Final()
        {
            int prc = 0;
            if (clk > 100)
            {
                prc = spt / (clk / 100);
            }
            tAvg = tAvg / pocet;
            textBox1.Text += string.Format("\r\nCelkem odesláno {0} paketů \r\n", clk);
            textBox1.Text += string.Format("Celkem přijato {0} paketů \r\n", spr);
            textBox1.Text += string.Format("Celkem ztraceno {0}({1}%) paketů \r\n\r\n", spt,prc);
            textBox1.Text += string.Format("Nejdelší doba: {0} ms", tMax);
            textBox1.Text += string.Format("\r\nNejkratší doba: {0} ms", tMin);
            textBox1.Text += string.Format("\r\nPrůměrná doba: {0} ms", tAvg);
        }
    }
}
 
Odpovědět 21.5.2014 9:21
Avatar
martus9519
Člen
Avatar
martus9519:

Vyřešeno, ping jsem hodil synchroně do backgroundworkeru, najednou to vylítlo na 13MiB/s a žádný kolísání ...

 
Nahoru Odpovědět 22.5.2014 9:40
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.