gpt4 book ai didi

c# - 获取网络事件进程生成的接收和发送字节

转载 作者:太空狗 更新时间:2023-10-29 21:48:22 32 4
gpt4 key购买 nike

这是我之前 question 的下一步.


I'm creating a C# WinForm Application which will display Network Activity (Bytes Received / Bytes Sent) for a given Process (For Example: Process name 's chrome.exe) and Speed in Megabits/s generated by the Process.

使用性能计数器 IO Read Bytes/secIO Read Bytes/sec 显示 I/O 读写字节而不是 'Send and Received字节的

PS:I/O 计算进程生成的所有文件、网络和设备 I/O 字节。但是,我只想要特定进程生成的网络字节。

我只想检索接收的字节数和发送的字节数。但是,不知道使用什么计数器来获取进程的这些字节。

我为此目的搜索了这些链接,但没有用:

这是尝试过的进程的性能计数器代码:

PerformanceCounter bytesReceived = new PerformanceCounter("Process", "IO Read Bytes/sec");
PerformanceCounter bytesSent = new PerformanceCounter("Process", "IO Write Bytes/sec");
string ProcessName = "chrome";
bytesReceived.InstanceName = ProcessName;
bytesSent.InstanceName = ProcessName;

问题:我如何只能获取进程为网络事件生成的已接收和已发送字节。

最佳答案

正如评论中已经提到的那样,我认为没有办法使用 PerformanceCounter 类来实现这一点。由于它使用 Windows 的内置性能计数器,这可以通过使用 typeperf 查询已安装计数器的整个列表来验证。命令。在我的本地机器上,这会产生大约 3.200 个不同的计数器,我通过这些计数器来验证我的声明。实际上有are网络发送/接收计数器(即使是特定网络接口(interface)/适配器或处理器),但它们都不能针对特定进程或进程系列进行过滤。


因此,更简单的方法可能是使用 this (已经相当完整)答案,它使用了 Microsoft.Diagnostics.Tracing.TraceEvent NuGet 包。为了进行测试,我将其压缩为最少量的代码并对其进行了修改以捕获整个流程系列的流量。

static void Main(string[] args)
{
// Counter variables
var counterLock = new object();
int received = 0;
int sent = 0;

// Fetch ID of all Firefox processes
var processList = Process.GetProcessesByName("firefox").Select(p => p.Id).ToHashSet();

// Run in another thread, since this will be a blocking operation (see below)
Task.Run(() =>
{
// Start ETW session
using(var session = new TraceEventSession("MyKernelAndClrEventsSession"))
{
// Query network events
session.EnableKernelProvider(KernelTraceEventParser.Keywords.NetworkTCPIP);

// Subscribe to trace events
// These will be called by another thread, so locking is needed here
session.Source.Kernel.TcpIpRecv += data =>
{
if(processList.Contains(data.ProcessID))
lock(counterLock)
received += data.size;
};
session.Source.Kernel.TcpIpSend += data =>
{
if(processList.Contains(data.ProcessID))
lock(counterLock)
sent += data.size;
};

// Process all events (this will block)
session.Source.Process();
}
});

// Program logic to handle counter values
while(true)
{
// Wait some time and print current counter status
Task.Delay(2000).Wait();
lock(counterLock)
Console.WriteLine($"Sent: {sent.ToString("N0")} bytes Received: {received.ToString("N0")} bytes");
}
}

请注意,您需要提升(管理员)权限才能执行此代码。

我用 Mozilla Firefox 进行了测试,当时有 10 个进程(7 个选项卡)在运行;我下载了一个大文件,程序正确地打印出增加的网络流量(加上来自事件选项卡的一些噪音),不包括涉及的磁盘访问(这至少会使测量的流量增加一倍)。

另请注意,这仅捕获 TCP/IP 流量;要同时捕获 UDP/IP 流量,您需要订阅 UdpIpSendUdpIpRecv 事件。

关于c# - 获取网络事件进程生成的接收和发送字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57978715/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com