2012-01-15 2 views
3

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

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(); 
     } 
    } 

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

+0

В любом случае, вместо того, чтобы перематывать свою собственную петлю, вы можете просто использовать метод SendFile. Это, вероятно, будет использовать TransmitFile Win32API под таким, что вам никогда не придется извлекать буферы из пространства ядра. http://msdn.microsoft.com/en-us/library/sx0a40c2.aspx – selbie

+0

Если это не закодированная ненулевая константа, вы должны ВСЕГДА проверять переменную знаменателя на «0» перед делением. – selbie

+0

mr selbie .. Я уже проверил эту ссылку раньше .. но у меня нет получателя, чтобы обрабатывать ее с другой стороны, и так как я не знаю, как работает SendFile, и я не получаю правильно, плюс я хочу поймать отправленные байты и показать они в progressBar .. что вы посоветуете мне делать? –

ответ

1

Для первой части вашего вопроса взять выглядеть это 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();   
    }  
+0

@MurHafSoz Добро пожаловать, я надеюсь, что это было то, что вам нужно. –

+0

thanks alot mr.Mark Hall Фактически, как вы видите, этот метод принимает только путь к файлу, который он собирается отправить .. вам не нужно смотреть на весь код программы .. возможно, потому что im делит целое на длинное значение у которого не было шанса получить больше 0 в то время. Мне нужен способ правильно рассчитать передачу файла: S –

+0

@MurHafSoz Вот почему я предложил отдельный таймер. Вы можете использовать меньшие приращения, чем 1 сек. если нужно. –

Смежные вопросы