2009-01-14 26 views
15

Có cách nào tôi có thể tính toán băng thông (gói được gửi và nhận) bởi một ứng dụng/exe qua mạng không? đã loooked vào IPGlobalProperties,Tính băng thông

và các lớp khác .... tôi muốn các gói được gửi n nhận được một ứng dụng duy nhất .. tôi đã kiểm tra http://netstatagent.com/ tôi cần một cái gì đó tương tự ... là có bất cứ điều gì trong .net mà có thể giúp tôi?

Ứng dụng của tôi kết nối với dịch vụ web để gửi một số tập tin hình ảnh ... và cũng nhận được file ...

Trả lời

21

Một cách là để lấy giá trị của performance counters ".NET CLR Networking/Bytes nhận" và " .NET CLR Networking/Bytes Sent" cho ứng dụng của bạn:

PerformanceCounter bytesSentPerformanceCounter= new PerformanceCounter(); 
bytesSentPerformanceCounter.CategoryName = ".NET CLR Networking"; 
bytesSentPerformanceCounter.CounterName = "Bytes Sent"; 
bytesSentPerformanceCounter.InstanceName = GetInstanceName(); 
bytesSentPerformanceCounter.ReadOnly = true; 

float bytesSent = bytesSentPerformanceCounter.NextValue(); 

//.... 

private static string GetInstanceName() 
{ 
    // Used Reflector to find the correct formatting: 
    string assemblyName = GetAssemblyName(); 
    if ((assemblyName == null) || (assemblyName.Length == 0)) 
    { 
    assemblyName = AppDomain.CurrentDomain.FriendlyName; 
    } 
    StringBuilder builder = new StringBuilder(assemblyName); 
    for (int i = 0; i < builder.Length; i++) 
    { 
    switch (builder[i]) 
    { 
     case '/': 
     case '\\': 
     case '#': 
     builder[i] = '_'; 
     break; 
     case '(': 
     builder[i] = '['; 
     break; 

     case ')': 
     builder[i] = ']'; 
     break; 
    } 
    } 
    return string.Format(CultureInfo.CurrentCulture, 
         "{0}[{1}]", 
         builder.ToString(), 
         Process.GetCurrentProcess().Id); 
} 

private static string GetAssemblyName() 
{ 
    string str = null; 
    Assembly entryAssembly = Assembly.GetEntryAssembly(); 
    if (entryAssembly != null) 
    { 
    AssemblyName name = entryAssembly.GetName(); 
    if (name != null) 
    { 
     str = name.Name; 
    } 
    } 
    return str; 
} 

Lưu ý rằng hiệu suất-quầykhông được tạo ra cho đến khi lần đầu tiên bạn sử dụng các thư viện mạng có liên quan (bạn sẽ nhận được InvalidOperation: Instance 'XXX' không tồn tại tôi n Danh mục được chỉ định) và bạn cần phải chèn

<configuration> 
    <system.net> 
    <settings> 
     <performanceCounters enabled="true" /> 
    </settings> 
    </system.net> 
</configuration> 

trong app.config của bạn.

Để tải xuống mẫu đầy đủ NetworkTraffic.csNetworkTraffic.exe.config.

+3

Mã này dường như không hoạt động nữa và cung cấp 'nvalidOperation: Instance 'XXX' không tồn tại trong lỗi Category' được chỉ định mỗi lần. – TheGateKeeper

+1

Tôi đang sử dụng windows 7 và .net 4.0 – TheGateKeeper

+0

"Lưu ý rằng các bộ đếm hiệu suất không được tạo cho đến khi lần đầu tiên bạn sử dụng các thư viện mạng có liên quan", điều này sẽ được in đậm:). Tôi đã dành rất nhiều thời gian để tìm ra điều gì sai, bởi vì trong các giải pháp khác nó không được đề cập. –

0

im tìm kiếm byte/giây trên mỗi ứng dụng ... không cho toàn bộ máy tính .... Có vẻ như không hoạt động đối với ứng dụng bảng điều khiển ... Thông báo lỗi: "ứng dụng bảng điều khiển không tồn tại trong Danh mục được chỉ định. "

+0

Có các phiên bản của các bộ đếm hiệu suất cho mỗi quá trình. Bạn sử dụng thuộc tính InstanceName để chọn thuộc tính bạn muốn. (PS. Bạn nên thêm một bình luận chứ không phải là một câu trả lời cho một cái gì đó như thế này). –

+0

Xem bài đăng cập nhật của tôi. –

0

này không hoạt động ... như xa như tôi biết bytesSentPerformanceCounter.InstanceName = "" // ở đây bạn cần phải cung cấp tên card mạng ...

+0

InstanceName là tên của thể hiện của PerformanceCounter. CLR định dạng chính xác như trong mã tôi đã viết, về cơ bản là "ApplicationName [ProcessId]". Hãy thử tải xuống mã tôi đã đính kèm vào bài đăng gốc. Nó hoạt động hoàn hảo cho tôi (Vista 32 bit, .Net 2.0). –

+0

Hi Rasmus, Cảm ơn code của bạn ... nó hoạt động hoàn hảo ... Tuy nhiên các byte được gửi và nhận luôn luôn là 0 ... Tôi phải nói rằng bạn chắc chắn rất am hiểu trong lĩnh vực này ... Tôi không thể thêm bình luận là "bình luận yêu cầu 50 danh tiếng" –

+0

Hi Rasmus, tôi đoán tôi đã giải quyết nó .... cảm ơn rất nhiều .. Thiên Chúa chúc lành cho bạn ... –

0

bằng cách nào đó các byte gửi là quá ít so với byte nhận được ... nó không phải là im duyệt mạng từ ứng dụng của tôi ... Tôi gửi đến các hình ảnh dịch vụ web (như byte) và các tập tin XML khác (vài kbs như chuỗi đầu vào cho chức năng dịch vụ web). Đổi lại tôi đôi khi trả lại mã lỗi hoặc bool ... vẫn là byte được gửi là cách quá ít hơn nhận được ... nhận được là 5 lần nữa ... im bối rối ...

+0

Hãy thử sử dụng WireShark để xem dữ liệu thực sự được gửi và nhận. Và kiểm tra lại rằng bạn chưa chuyển và nhận. Bạn cũng có thể thử kiểm tra các bộ đếm hiệu suất bằng cách sử dụng màn hình hiệu suất. –

4

Tôi nhớ đã đọc một bài viết về điều này và đào nó lên cho bạn, http://nayyeri.net/blog/how-to-calculate-network-utilization-in-net/

một đoạn trích trước mã của họ:

NET đi kèm với ba hiệu suất quầy cho các thông số được sử dụng trong công thức sử dụng mạng ra khỏi hộp. Tất cả các bộ đếm này đều nằm ở trong danh mục Giao diện mạng và là có tên "Bytes Sent/sec", "Bytes Received/sec" và "Current Bandwidth". Thông số duy nhất yêu cầu một số nỗ lực bổ sung cần được tính là time_in_sec.

"Bytes Sent/giây" và "Bytes Nhận/giây" quầy tính giá trị của họ dựa trên các mẫu khác nhau và cách tốt nhất để có được một giá trị tốt hơn từ các quầy được tìm tổng kết các giá trị của họ trong một vòng lặp vì trong một số trường hợp, giá trị của chúng có thể là bằng 0 hoặc rất khác với trạng thái thực của mạng . Sau đó, chúng ta có thể tìm tham số time_in_sec bởi tìm số lần rằng vòng lặp được lặp vì bộ đếm hiệu suất của chúng tôi tìm thấy giá trị của họ cho một giây thời gian tổng thể trong giây tương đương với số lượng lặp.

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