/// <summary> /// 根据程序名统计流量 /// </summary> public static void NetTraffic() { if (!Flags.IsWindows10Upper) { return; } var counterLock = new object(); //int sent = 0; //var processList = Process.GetProcessesByName(ProcessName).Select(p => p.Id).ToHashSet(); var instances = new List <Process>(); switch (MainController.ServerController) { case null: break; case Guard instanceController: if (instanceController.Instance != null) { instances.Add(instanceController.Instance); } break; } if (!instances.Any()) { switch (MainController.ModeController) { case null: break; case NFController _: instances.Add(Process.GetCurrentProcess()); break; case Guard instanceController: instances.Add(instanceController.Instance !); break; } } var processList = instances.Select(instance => instance.Id).ToList(); Logging.Info("流量统计进程:" + string.Join(",", instances.Select(instance => $"({instance.Id})" + instance.ProcessName).ToArray())); received = 0; if (!instances.Any()) { return; } Global.MainForm.BandwidthState(true); Task.Run(() => { tSession = new TraceEventSession("KernelAndClrEventsSession"); tSession.EnableKernelProvider(KernelTraceEventParser.Keywords.NetworkTCPIP); //这玩意儿上传和下载得到的data是一样的:) //所以暂时没办法区分上传下载流量 tSession.Source.Kernel.TcpIpRecv += data => { if (processList.Contains(data.ProcessID)) { lock (counterLock) received += (ulong)data.size; } // Debug.WriteLine($"TcpIpRecv: {ToByteSize(data.size)}"); }; tSession.Source.Kernel.UdpIpRecv += data => { if (processList.Contains(data.ProcessID)) { lock (counterLock) received += (ulong)data.size; } // Debug.WriteLine($"UdpIpRecv: {ToByteSize(data.size)}"); }; tSession.Source.Process(); }); while (Global.MainForm.State != State.Stopped) { Task.Delay(1000).Wait(); lock (counterLock) Global.MainForm.OnBandwidthUpdated(received); } }