Расчет пропускной способности - PullRequest
17 голосов
/ 14 января 2009

Есть ли способ, которым я могу рассчитать пропускную способность (пакеты отправлены и получены) exe / приложения через сеть? присоединились к IPGlobalProperties ,

и другие классы .... я хочу, чтобы отправленные пакеты были получены одним приложением .. я проверил http://netstatagent.com/ Мне нужно что-то подобное ... Есть ли в .net что-нибудь, что может мне помочь?

Мое приложение подключается к веб-сервису для отправки некоторых файлов изображений ... и также получает файлы ...

Ответы [ 5 ]

22 голосов
/ 14 января 2009

Одним из способов является получение значения счетчиков производительности".NET CLR Networking / Bytes Received" и ".NET CLR Networking / Bytes Sent" для вашего приложения:

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

Обратите внимание, что счетчики производительности не создаются до тех пор, пока вы в первый раз не используете соответствующие сетевые библиотеки (вы получите InvalidOperation: экземпляр 'XXX' не существует в указанная категория) и что нужно вставить

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

в вашем app.config.

Для получения полного образца загрузите NetworkTraffic.cs и NetworkTraffic.exe.config .

4 голосов
/ 21 января 2009

Я вспомнил, как читал статью об этом, и выкопал ее для вас, http://nayyeri.net/blog/how-to-calculate-network-utilization-in-net/

выдержка перед их кодом:

.NET поставляется с тремя характеристиками счетчики используемых параметров в формула использования сети из коробка. Все эти счетчики расположены в категории сетевого интерфейса и с именем "Отправлено байт / сек", "Байт Получено / сек »и« Текущая пропускная способность ». Единственный параметр, который требует некоторых дополнительные усилия для расчета time_in_sec.

«Отправлено байт / сек» и «Байт» Полученные / сек "счетчики вычисляют их значения на основе разных образцов и лучший способ получить лучшую ценность из этих счетчиков находит суммирование их значений в цикле потому что в некоторых случаях их значения могут быть нулевым или сильно отличаться от реальное состояние сети. Тогда мы можем найти параметр time_in_sec по найти количество раз, что цикл повторяется, потому что наш счетчики производительности находят свои значения в течение одной секунды общее время в секунд равно числу итераций.

0 голосов
/ 21 января 2009

каким-то образом отправленные байты слишком малы, чем полученные байты ... это не значит, что я просматриваю сеть из моего приложения ... Я отправляю в веб-сервис изображения (в байтах) и другие файлы XML (несколько килобайт в качестве ввода строки к функции веб-службы). В ответ я иногда возвращаю коды ошибок или bool ... тем не менее отправленные байты слишком малы, чем получены ... получены в 5 раз больше ... я озадачен ...

0 голосов
/ 15 января 2009

Это не работает ... насколько я знаю bytesSentPerformanceCounter.InstanceName = "" // здесь необходимо указать имя сетевой карты ...

0 голосов
/ 14 января 2009

я ищу байт / сек для приложения ... не для всего компьютера .... Не похоже, что работает для консольного приложения ... Сообщение об ошибке: "консольное приложение не существует в указанной категории."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...