2009-07-05 26 views
15

Tôi muốn tạo kiểm tra tốc độ để kiểm tra kết nối. Điều tôi muốn là bản tải xuống 15 giây mà sau đó cung cấp cho tôi tốc độ tải xuống trung bình.Cách tạo kiểm tra tốc độ tải xuống bằng .NET (C#)

Bất kỳ ai biết cách tạo điều này? hoặc có ý tưởng tốt hơn để thực hiện kiểm tra tốc độ?

Cảm ơn bạn đã đọc!

Trả lời

3
  • Sử dụng kích thước tệp đã biết và bẫy mất bao lâu để tải xuống. (sử dụng hai DateTime.now() s)

Có một thư viện trên CodeProject mà tôi tìm thấy. Nó là một vài lớp C# cho phép bạn theo dõi các kết nối mạng của bạn bao gồm tốc độ tải lên và tải xuống. Link here

0

Trong mạng chấm điểm Visual Basic, lớp "My" cung cấp chức năng tải xuống tệp, cố gắng tìm kiếm bí danh của nó trong C#. Sau đó, tạo bộ đếm thời gian và đếm giây đã trôi qua kể từ khi quá trình tải xuống bắt đầu.

15

Mẫu này sẽ cố gắng tải xuống googletalk, sau đó xuất ra chi tiết về tải xuống.

ps. khi cố gắng để thời gian và hoạt động tránh sử dụng DateTime vì chúng có thể gây ra vấn đề hoặc inacurecy, luôn luôn sử dụng đồng hồ bấm giờ có sẵn tại không gian tên System.Diognostics.

const string tempfile = "tempfile.tmp"; 
    System.Net.WebClient webClient = new System.Net.WebClient(); 

    Console.WriteLine("Downloading file...."); 

    System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew(); 
    webClient.DownloadFile("http://dl.google.com/googletalk/googletalk-setup.exe", tempfile); 
    sw.Stop(); 

    FileInfo fileInfo = new FileInfo(tempfile); 
    long speed = fileInfo.Length/sw.Elapsed.Seconds; 

    Console.WriteLine("Download duration: {0}", sw.Elapsed); 
    Console.WriteLine("File size: {0}", fileInfo.Length.ToString("N0")); 
    Console.WriteLine("Speed: {0} bps ", speed.ToString("N0")); 

    Console.WriteLine("Press any key to continue..."); 
    Console.ReadLine(); 
+1

Khi cố gắng để mã tiểu sử ở mức rất tốt nên tránh DateTime.Now(). Nhưng đối với một cái gì đó giống như một tập tin tải về (mà mất nhiều thời gian hơn so với độ chính xác của Now), nó chỉ là tốt. – colithium

+0

Hoặc sử dụng 'QueryPerformanceFrequency' và 'QueryPerformanceCounter' làm bộ hẹn giờ. – Icebob

+4

tại sao phải trải qua sự cố khi sử dụng bộ đếm hiệu suất hoặc thậm chí là DateTime.Now khi Đồng hồ bấm giờ dễ sử dụng và được xây dựng cho mục đích này. nó cũng làm cho mã của bạn dễ hiểu vì rõ ràng là bạn đang định thời gian một hàm. –

2

cách tệp tải xuống có thể cung cấp cho bạn tốc độ liên kết chính xác. những gì bạn nhận được bằng cách tải xuống tập tin là một đánh giá thấp tuyệt vời của tốc độ thực tế những gì bạn nhận được.

Điều tôi nghĩ là bạn nên thực hiện một số loại chuyển gói dữ liệu udp và tìm thời gian cần thiết để nhận nó ở đầu bên kia.

regards,

0

Sử dụng mã để kiểm tra tốc độ kết nối Internet sử dụng C#:

private long bytesReceivedPrev = 0; 
    private void CheckBandwidthUsage(DateTime now) 
    { 
     NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); 
     long bytesReceived = 0; 
     foreach (NetworkInterface inf in interfaces) 
     { 
      if (inf.OperationalStatus == OperationalStatus.Up && 
       inf.NetworkInterfaceType != NetworkInterfaceType.Loopback && 
       inf.NetworkInterfaceType != NetworkInterfaceType.Tunnel && 
       inf.NetworkInterfaceType != NetworkInterfaceType.Unknown && !inf.IsReceiveOnly) 
      { 
       bytesReceived += inf.GetIPv4Statistics().BytesReceived; 
      } 
     } 

     if (bytesReceivedPrev == 0) 
     { 
      bytesReceivedPrev = bytesReceived; 
     } 
     long bytesUsed = bytesReceived - bytesReceivedPrev; 
     double kBytesUsed = bytesUsed/1024; 
     double mBytesUsed = kBytesUsed/1024; 
     internetUsage.Add(now, mBytesUsed); 
     if (internetUsage.Count > 20) 
     { 
      internetUsage.Remove(internetUsage.Keys.First()); 
     } 
     bytesReceivedPrev = bytesReceived; 
    } 

    private void CheckInternetSpeed(DateTime now) 
    { 
     WebClient client = new WebClient(); 
     Uri URL = new Uri("http://sixhoej.net/speedtest/1024kb.txt"); 
     double starttime = Environment.TickCount; 
     client.DownloadFile(URL, Constants.GetAppDataPath() + "\\" + now.Ticks); 
     double endtime = Environment.TickCount; 

     double secs = Math.Floor(endtime - starttime)/1000; 

     double secs2 = Math.Round(secs, 0); 

     double kbsec = Math.Round(1024/secs); 

     double mbsec = kbsec/100; 

     internetSpeed.Add(now, mbsec); 
     if (internetSpeed.Count > 20) 
     { 
      internetSpeed.Remove(internetSpeed.Keys.First()); 
     } 
     client.Dispose(); 
     try 
     { 
      // delete downloaded file 
      System.IO.File.Delete(Constants.GetAppDataPath() + "\\" + now.Ticks); 
     } 
     catch (Exception ex1) 
     { 
      Console.WriteLine(ex1.Message); 
     } 
    } 
8

Như publicENEMY nói, câu trả lời của 's kay.one có thể cung cấp một tốc độ sai, bởi vì tốc độ của HDD có thể thấp hơn so với tốc độ mạng (ví dụ: Google Gigabit Fiber nhanh hơn tốc độ ghi trung bình của ổ cứng 5200rpm)

Đây là mã ví dụ có nguồn gốc từ câu trả lời của kay.one, nhưng tải xuống d nội dung ata thành System.Byte[] và do đó trong bộ nhớ. Ngoài ra tôi nhận thấy rằng sau lần tải xuống đầu tiên, tốc độ tăng đáng kể và nhảy qua tốc độ mạng thực, vì System.Net.WebClient sử dụng bộ nhớ cache tải xuống của IE: cho các yêu cầu của tôi, tôi chỉ thêm tham số truy vấn t, rõ ràng là duy nhất cho mỗi yêu cầu .

EDIT

as.beaulieu tìm thấy một vấn đề sử dụng TimeSpan.Seconds cho việc tính toán, cả hai đều cho tải rất nhanh và rất chậm.

Thay vào đó, chúng tôi chỉ cần sử dụng TimeSpan.TotalSeconds.

Console.WriteLine("Downloading file...."); 

var watch = new Stopwatch(); 

byte[] data; 
using (var client = new System.Net.WebClient()) 
{ 
    watch.Start(); 
    data = client.DownloadData("http://dl.google.com/googletalk/googletalk-setup.exe?t=" + DateTime.Now.Ticks); 
    watch.Stop(); 
} 

var speed = data.LongLength/watch.Elapsed.TotalSeconds; // instead of [Seconds] property 

Console.WriteLine("Download duration: {0}", watch.Elapsed); 
Console.WriteLine("File size: {0}", data.Length.ToString("N0")); 
Console.WriteLine("Speed: {0} bps ", speed.ToString("N0")); 

Console.WriteLine("Press any key to continue..."); 
Console.ReadLine(); 
+0

Tôi đã học được A LOT từ câu trả lời này. Cảm ơn nhiều! – Owen

+0

Tôi đang gặp sự cố tải xuống nhanh đến mức vài phần nghìn giây trong đó số lượt tải xuống được làm tròn xuống 0 và tôi nhận được sai số bằng 0 ở dòng 'var speed = ...'. Làm thế nào tôi sẽ sửa chữa tốt nhất? –

+1

@ as.beaulieu bạn đúng, và bạn hiển thị một vấn đề khác có thể xảy ra với mã đó: nếu quá trình tải xuống mất hơn một phút, 'Thứ hai' sẽ đưa ra giá trị sai cho phép tính của chúng tôi. Tôi đã cập nhật mã, chỉ cần sử dụng 'TotalSeconds'. –

Các vấn đề liên quan