Calculating Bandwidth

前端 未结 5 1021
无人共我
无人共我 2020-11-27 14:54

Is there any way i can calculate bandwidth (packets sent and received) by an exe/application via net? have looked into IPGlobalProperties, and other classes.

I want

相关标签:
5条回答
  • 2020-11-27 15:22

    i m lookin for bytes/sec per application... not for the whole computer ....Doesnt seem to be working for a console appl... Error message:"console app does not exist in the specified Category."

    0 讨论(0)
  • 2020-11-27 15:26

    I remembered reading an article about this and dug it up for you, http://nayyeri.net/blog/how-to-calculate-network-utilization-in-net/

    an excerpt before their code:

    .NET comes with three performance counters for the used parameters in network utilization formula out of the box. All of these counters are located in Network Interface category and are named "Bytes Sent/sec", "Bytes Received/sec" and "Current Bandwidth". The only parameter that requires some extra effort to be calculated is time_in_sec.

    "Bytes Sent/sec" and "Bytes Received/sec" counters calculate their values based on different samples and the best way to get a better value from these counters is finding the summation of their values in a loop because in some cases their values may be zero or very different from the real state of the network. Then we can find the time_in_sec parameter by finding the number of times that the loop is iterated because our performance counters find their values for one seconds the overall time in seconds is equal to the number of iterations.

    0 讨论(0)
  • 2020-11-27 15:26

    somehow the bytes sent is way too less than bytes received... its not that i m browsing net from my application... I send to the web service images(as bytes) and other XML files (few kbs as string input to web service function). In return i sometimes return error codes or bool... still the bytes sent is way too less than received... received is 5 times more...i m puzzled...

    0 讨论(0)
  • 2020-11-27 15:27

    This does not work... as far as i know bytesSentPerformanceCounter.InstanceName ="" // here you need to give network card name ...

    0 讨论(0)
  • 2020-11-27 15:28

    One way is to retrieve the value of the performance counters ".NET CLR Networking/Bytes Received" and ".NET CLR Networking/Bytes Sent" for your application:

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

    Note that the performance-counters aren't created until the first time you use the relevant network libraries (you will get InvalidOperation : Instance 'XXX' does not exist in the specified Category) and that you need to insert

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

    in your app.config.

    For a full sample download NetworkTraffic.cs and NetworkTraffic.exe.config.

    0 讨论(0)
提交回复
热议问题