Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Статистика сетевой активности процесса

#c_sharp #net #visual_studio #сеть #трафик


Никак не могу найти возможности определить сетевую активность процесса(ов), сколько
принял и сколько отправил байт, хотя монитор ресурсов Windows это легко делает. Есть
хоть какие примеры по данной тематике (можно примеры и WinAPI, Basic)?  
    


Ответы

Ответ 1



Для отслеживания событий передачи данных по сети в Windows существует механизм Event Tracing. Чтобы использовать его в .NET, можно подключить библиотеку TraceEvent и обрабатывать события TcpIpRecv/TcpIpSend провайдера Microsoft-Windows-Kernel-Network, содержащие размер переданных или полученных байт: using System; using System.Collections.Generic; using System.Data; using System.Text; using System.Diagnostics; using System.Threading; using Microsoft.Diagnostics.Tracing.Parsers; using Microsoft.Diagnostics.Tracing.Session; namespace ConsoleApplication1 { class Program { static TraceEventSession m_EtwSession; static void ThreadProc() { int pid = Process.GetProcessesByName("Program")[0].Id; using (m_EtwSession = new TraceEventSession(KernelTraceEventParser.KernelSessionName)) { m_EtwSession.StopOnDispose = true; m_EtwSession.EnableKernelProvider(KernelTraceEventParser.Keywords.NetworkTCPIP); m_EtwSession.Source.Kernel.TcpIpRecv += data => { if (data.ProcessID == pid) { Console.WriteLine("Received: " + data.size.ToString() + " bytes "); } }; m_EtwSession.Source.Kernel.TcpIpSend += data => { if (data.ProcessID == pid) { Console.WriteLine("Sent: " + data.size.ToString() + " bytes "); } }; m_EtwSession.Source.Process(); } } public static void Main(string[] argv) { Thread th = new Thread(ThreadProc); th.IsBackground = true; th.Start(); Console.WriteLine("Press any key to stop tracing..."); Console.ReadKey(); m_EtwSession.Dispose(); } } }

Комментариев нет:

Отправить комментарий