| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- using CapturePackage;
- using Oreo.NetMonitor.Models;
- using Oreo.NetMonitor.Services;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Diagnostics;
- using System.Drawing;
- using System.Linq;
- using System.Management;
- using System.Net;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using Y.Utils.DataUtils.UnitConvertUtils;
- namespace Oreo.NetMonitor.Views
- {
- public partial class NetReportForm : Form
- {
- NativeSocket2 _rs;
- long NowBag = 0;
- //string IP = "10.49.138.175";
- string IP = "";
- List<NetProcess> netProcesses = new List<NetProcess>();
- DateTime BeginTime = DateTime.Now;
- DateTime MaxTime = DateTime.Now.AddMinutes(NetWorkService.ThresholdTime * 2);
- public NetReportForm()
- {
- InitializeComponent();
- }
- private void NetReportForm_Load(object sender, EventArgs e)
- {
- #region 启动功能
- this.ShowInTaskbar = false;
- this.Hide();
- IP = GetIP();
- Task.Factory.StartNew(() =>
- {
- try
- {
- while (!this.IsDisposed)
- {
- GetNetProcess();
- CalcBagFlow();
- this.Invoke(new Action(() =>
- {
- status.Text = string.Format("信息:IP:{0},上传流量:{1},下载流量:{2}",
- IP, ByteConvertTool.Fmt(NetWorkService.NowSent), ByteConvertTool.Fmt(NetWorkService.NowReceived));
- status.Text += string.Format("\n单位时间:{0}分钟,上传流量:{1},下载流量:{2}",
- NetWorkService.ThresholdTime, ByteConvertTool.Fmt(NetWorkService.UnitSent), ByteConvertTool.Fmt(NetWorkService.UnitReceived));
- status.Text += string.Format("\n当前时间:{0},下次刷新时间:{1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), NetWorkService.CalcTime.ToString("yyyy-MM-dd HH:mm:ss"));
- if ((NetWorkService.UnitSent + NetWorkService.UnitReceived) < NetWorkService.FlowThreshold || DateTime.Now > MaxTime)
- {
- NetWorkService.WriteRecord(BeginTime, DateTime.Now, netProcesses, IP);
- this.Dispose();
- }
- }));
- Thread.Sleep(1000);
- }
- }
- catch { }
- });
- CaptureInit();
- Task.Factory.StartNew(() => { try { _rs.Capture(); } catch { } });
- #endregion
- }
- #region 抓包过程
- private void CaptureInit()
- {
- _rs = new NativeSocket2(IPAddress.Parse(IP));
- _rs.IsStart = true;
- _rs.OnIPPacketCapure = (IPPacket tp) =>
- {
- this.Invoke(new Action(() =>
- {
- try
- {
- if (tp.SrcAddr.ToString() == IP)
- {
- //源地址是本机-从本机发出
- lock (netProcesses)
- {
- foreach (var item in netProcesses)
- {
- int inPort = item.Ports.Where(x => x.Port == tp.SrcPort).Count(); ;
- if (inPort > 0)
- {
- item.UpBag++;
- if (item.UpBag > 1000) item.UpBag = 0;
- NowBag++;
- }
- }
- }
- }
- if (tp.DestAddr.ToString() == IP)
- {
- //目标地址是本机-本机接收
- lock (netProcesses)
- {
- foreach (var item in netProcesses)
- {
- int inPort = item.Ports.Where(x => x.Port == tp.DestPort).Count(); ;
- if (inPort > 0)
- {
- item.DownBag++;
- if (item.DownBag > 1000) item.DownBag = 0;
- NowBag++;
- }
- }
- }
- }
- }
- catch { }
- }));
- };
- }
- #endregion
- #region 联网进程
- private void GetNetProcess()
- {
- foreach (var item in NetProcessAPI.GetAllTcpConnections())
- {
- AddTCPNetProcess(item);
- }
- foreach (var item in NetProcessAPI.GetAllUdpConnections())
- {
- AddUDPNetProcess(item);
- }
- }
- private void AddTCPNetProcess(TcpRow item)
- {
- try
- {
- var _netProcess = netProcesses.FirstOrDefault(x => x.ProcessID == item.owningPid);
- if (_netProcess == null)
- {
- _netProcess = new NetProcess() { ProcessID = item.owningPid, ProcessName = ProcessAPI.GetProcessNameByPID(item.owningPid) };
- netProcesses.Add(_netProcess);
- }
- if (_netProcess.Ports.FirstOrDefault(x => x.Port == item.LocalPort) == null)
- {
- _netProcess.ProcessICon = ProcessAPI.GetIcon(item.owningPid, true);
- }
- _netProcess.Ports.Add(GetTcpProcessPort(item));
- }
- catch (Exception e)
- {
- }
- }
- private void AddUDPNetProcess(UdpRow item)
- {
- try
- {
- var _netProcess = netProcesses.FirstOrDefault(x => x.ProcessID == item.owningPid);
- if (_netProcess == null)
- {
- _netProcess = new NetProcess() { ProcessID = item.owningPid, ProcessName = ProcessAPI.GetProcessNameByPID(item.owningPid) };
- netProcesses.Add(_netProcess);
- }
- if (_netProcess.Ports.FirstOrDefault(x => x.Port == item.LocalPort) == null)
- {
- _netProcess.ProcessICon = ProcessAPI.GetIcon(item.owningPid, true);
- _netProcess.Ports.Add(GetUDPProcessPort(item));
- }
- }
- catch (Exception e)
- {
- }
- }
- private ProcessPort GetTcpProcessPort(TcpRow tr)
- {
- ProcessPort _pp = new ProcessPort()
- {
- LocalAddress = tr.LocalAddress.ToString(),
- Port = tr.LocalPort,
- RemoteAddress = tr.RemoteAddress.ToString(),
- Type = ProtocolType.TCPType,
- RemotePort = tr.RemotePort,
- };
- return _pp;
- }
- private ProcessPort GetUDPProcessPort(UdpRow tr)
- {
- ProcessPort _pp = new ProcessPort()
- {
- LocalAddress = tr.LocalAddress.ToString(),
- Port = tr.LocalPort,
- RemoteAddress = "",
- Type = ProtocolType.UDPType,
- RemotePort = 0,
- };
- return _pp;
- }
- #endregion
- #region 矫正流量
- private void CalcBagFlow()
- {
- lock (netProcesses)
- {
- foreach (var pro in netProcesses)
- {
- long temp = pro.UpBag + pro.DownBag;
- double rate = 0;
- if (NowBag > 0 && temp > 0)
- rate = (double)temp / (double)NowBag;
- pro.UpLoad = (long)(NetWorkService.NowSent * rate);
- pro.DownLoad = (long)(NetWorkService.NowReceived * rate);
- pro.UpLoadCount += pro.UpLoad;
- pro.DownLoadCount += pro.DownLoad;
- pro.UpBag = 0;
- pro.DownBag = 0;
- }
- }
- NowBag = 0;
- }
- #endregion
- #region 获取IP
- public string GetIP()
- {
- IPHostEntry myEntry = Dns.GetHostEntry(Dns.GetHostName());
- return myEntry.AddressList.FirstOrDefault<IPAddress>(e => e.AddressFamily.ToString().Equals("InterNetwork")).ToString();
- }
- #endregion
- }
- }
|