Есть ли способ рассчитать пропускную способность (количество отправленных и полученных пакетов) исполняемым файлом / приложением через сеть? изучили IPGlobalProperties и другие классы.
Я хочу, чтобы пакеты отправлялись и принимались одним приложением. Я проверил http://netstatagent.com/ и нужно что-то подобное.
Есть ли что-нибудь в .Net, что может мне помочь?
Мое приложение подключается к веб-службе для отправки и получения файлов изображений.





Один из способов - получить значение счетчики производительности «.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.
Я использую windows 7 и .net 4.0
«Обратите внимание, что счетчики производительности не создаются до первого использования соответствующих сетевых библиотек», это должно быть выделено жирным шрифтом :). Я потратил много времени, пытаясь понять, что не так, потому что в других решениях это не упоминалось.
Я ищу байты / сек для каждого приложения ... не для всего компьютера .... Кажется, не работает для консольного приложения ... Сообщение об ошибке: «Консольное приложение не существует в указанной категории».
Существуют экземпляры счетчиков производительности для каждого процесса. Вы используете свойство InstanceName, чтобы выбрать, какой из них вы хотите. (PS. Вы должны добавить комментарий, а не ответ на что-то вроде этого).
Это не работает ... насколько я знаю bytesSentPerformanceCounter.InstanceName = "" // здесь нужно указать имя сетевой карты ...
InstanceName - это имя экземпляра PerformanceCounter. CLR форматирует его точно так же, как в коде, который я написал, в основном «ApplicationName [ProcessId]». Попробуйте скачать код, который я прикрепил к исходному сообщению. У меня он отлично работает (Vista 32 бит, .Net 2.0).
Привет, Расмус, Спасибо за ваш код ... он работает отлично ... Однако отправленные и полученные байты всегда равны 0 ... Я должен сказать, что вы, безусловно, очень хорошо осведомлены в этой области .net ... Я не могу добавить комментарий как "для комментирования требуется 50 репутации"
Расмус, мне интересно, не могли бы вы указать мне на хороший ресурс по счетчикам производительности ... может быть, книгу ...
Простите. Я не могу придумать никаких хороших ресурсов. Может быть, вам стоит задать это как отдельный вопрос?
каким-то образом отправленные байты намного меньше, чем полученные байты ... это не то, что я просматриваю сеть из моего приложения ... Я отправляю изображения веб-службы (в байтах) и другие файлы XML (несколько килобайт в качестве строкового ввода в веб-службу функция). Взамен я иногда возвращаю коды ошибок или bool ... все же отправленных байтов слишком мало, чем полученных ... полученных в 5 раз больше ... я озадачен ...
Попробуйте использовать WireShark для просмотра фактически отправленных и полученных данных. И еще раз проверьте, что вы не переключили полученный и отправленный. Вы также можете попробовать проверить счетчики производительности с помощью монитора производительности.
Я вспомнил, что читал об этом статью и откопал для вас, http://nayyeri.net/blog/how-to-calculate-network-utilization-in-net/
отрывок перед их кодом:
.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.
Этот код больше не работает и каждый раз выдает ошибку
nvalidOperation : Instance 'XXX' does not exist in the specified Category.