Ejemplo n.º 1
0
        /// <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);
            }
        }