【发布时间】:2019-09-17 17:30:10
【问题描述】:
有什么方法可以通过网络计算 exe/应用程序的带宽(发送和接收的数据包)?已经研究了IPGlobalProperties 和其他类。
我想要由单个应用程序发送和接收的数据包。我检查了http://netstatagent.com/,需要类似的东西。
.Net 中有什么可以帮助我的吗?
我的应用连接到网络服务以发送和接收一些图像文件。
【问题讨论】:
有什么方法可以通过网络计算 exe/应用程序的带宽(发送和接收的数据包)?已经研究了IPGlobalProperties 和其他类。
我想要由单个应用程序发送和接收的数据包。我检查了http://netstatagent.com/,需要类似的东西。
.Net 中有什么可以帮助我的吗?
我的应用连接到网络服务以发送和接收一些图像文件。
【问题讨论】:
一种方法是为您的应用程序检索performance counters“.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 : Instance 'XXX' does not exist在指定的类别中)并且您需要插入
<configuration>
<system.net>
<settings>
<performanceCounters enabled="true" />
</settings>
</system.net>
</configuration>
在您的 app.config 中。
如需完整示例,请下载NetworkTraffic.cs 和NetworkTraffic.exe.config。
【讨论】:
nvalidOperation : Instance 'XXX' does not exist in the specified Category 错误。
我记得读过一篇关于此的文章并为你挖出来,http://nayyeri.net/blog/how-to-calculate-network-utilization-in-net/
他们的代码之前的摘录:
.NET 自带三种性能 中使用的参数的计数器 网络利用率公式 盒子。所有这些柜台都位于 在网络接口类别中,并且是 命名为“字节发送/秒”,“字节 接收/秒”和“当前带宽”。 唯一需要一些参数 要计算的额外努力是 time_in_sec.
“每秒发送的字节数”和“字节数 Received/sec" 计数器计算其 基于不同样本的值和 获得更好价值的最佳方式 从这些柜台正在寻找 在循环中对它们的值求和 因为在某些情况下,它们的值可能 为零或与 网络的真实状态。然后我们可以 找到 time_in_sec 参数 找到的次数 循环是迭代的,因为我们的 性能计数器找到它们的值 一秒钟的总时间 秒数等于 迭代。
【讨论】:
我正在查找每个应用程序的字节/秒...不是整个计算机...。似乎不适用于控制台应用程序...错误消息:“指定类别中不存在控制台应用程序。”
【讨论】:
这不起作用...据我所知 bytesSentPerformanceCounter.InstanceName ="" //这里需要给网卡名...
【讨论】:
不知何故,发送的字节比接收的字节少...这不是我从我的应用程序浏览网络...我发送到 Web 服务图像(作为字节)和其他 XML 文件(几 kbs 作为字符串输入到网络服务功能)。作为回报,我有时会返回错误代码或布尔值...发送的字节仍然比收到的少得多...收到的字节数是 5 倍...我很困惑...
【讨论】: