как рассчитать скорость передачи скорости кб / с розетки c # - PullRequest
3 голосов
/ 16 января 2012

Как рассчитать скорость передачи данных в килобайтах в секунду, я использовал секундомер, но он не работает, потому что он дает мне ошибку о div на ноль (count / 0)

    public void sendFile(string filePath)
    {
        Stopwatch stopWatch = new Stopwatch();
        FileInfo file = new FileInfo(filePath);
        try
        {
            int fileSize = (int)file.Length;
            Program.mainForm.MaxProgressBarHandler(fileSize);
            byte[] fileDetial;
            string detail =  file.Name + "," + fileSize.ToString();
            fileDetial = Encoding.ASCII.GetBytes(detail);
            client.Send(fileDetial);
            byte[] fileData = new byte[fileSize];

            int count;
            int sum = 0;
            file.OpenRead().Read(fileData, 0, fileSize);
            while (sum < fileSize)
            {
                stopWatch.Restart();
                if (fileSize - sum < packetSize)
                {
                    count = client.Send(fileData, sum, fileSize - sum, SocketFlags.None);
                    Program.mainForm.UpdateProgressBarHandler(count);
                }
                else
                {
                    count = client.Send(fileData, sum, packetSize, SocketFlags.None);
                    Program.mainForm.UpdateProgressBarHandler(count);
                }
                stopWatch.Stop();
                sum += count;
                Program.mainForm.AppendLabel(((fileSize * 8) / stopWatch.ElapsedMilliseconds).ToString());
                Console.WriteLine(sum + "of" + fileSize + "sent");
            }
        }
        finally
        {
            Console.WriteLine("sent");
            CloseClient();
        }
    }

Пожалуйста, помогите мне =)

1 Ответ

1 голос
/ 16 января 2012

Для первой части вашего вопроса взгляните на эту Joel On Software Forum Thread . Он не имеет отношения к .Net, а напрямую связан с передачей файла по протоколу TCP.

Что касается второй части, так как у меня нет вашего полного кода, поэтому я не могу понять, почему ваш stopWatch.ElapsedMilliseconds равен нулю. Я думаю, что не было данных для передачи. Вы можете попробовать сделать что-то подобное, чтобы избежать ошибки деления на ноль.

if (stopWatch.ElapsedMilliseconds != 0)
    Program.mainForm.AppendLabel(((fileSize * 8) / stopWatch.ElapsedMilliseconds).ToString());

Хотя у меня, вероятно, был бы 1-секундный таймер, и я сделал бы sum переменной области видимости и обновлял бы вашу метку каждую секунду, т.е.:

public partial class Form1 : Form
{
    int sum = 0;
    int seconds = 0;
...

private void timer1_Tick(object sender, EventArgs e)
{
    seconds += 1;
    Program.mainForm.AppendLabel(((sum * 8) / seconds).ToString());
} 

и сбросьте их, когда закончите перевод.

....
finally        
    {        
        timer1.Stop();
        sum = 0;
        seconds = 0
        Console.WriteLine("sent");        
        CloseClient();        
    }    
...