NetReportForm.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. using CapturePackage;
  2. using Oreo.NetMonitor.Models;
  3. using Oreo.NetMonitor.Services;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.ComponentModel;
  7. using System.Data;
  8. using System.Diagnostics;
  9. using System.Drawing;
  10. using System.Linq;
  11. using System.Management;
  12. using System.Net;
  13. using System.Text;
  14. using System.Threading;
  15. using System.Threading.Tasks;
  16. using System.Windows.Forms;
  17. using Y.Utils.DataUtils.UnitConvertUtils;
  18. namespace Oreo.NetMonitor.Views
  19. {
  20. public partial class NetReportForm : Form
  21. {
  22. NativeSocket2 _rs;
  23. long NowBag = 0;
  24. //string IP = "10.49.138.175";
  25. string IP = "";
  26. List<NetProcess> netProcesses = new List<NetProcess>();
  27. DateTime BeginTime = DateTime.Now;
  28. DateTime MaxTime = DateTime.Now.AddMinutes(NetWorkService.ThresholdTime * 2);
  29. public NetReportForm()
  30. {
  31. InitializeComponent();
  32. }
  33. private void NetReportForm_Load(object sender, EventArgs e)
  34. {
  35. #region 启动功能
  36. this.ShowInTaskbar = false;
  37. this.Hide();
  38. IP = GetIP();
  39. Task.Factory.StartNew(() =>
  40. {
  41. try
  42. {
  43. while (!this.IsDisposed)
  44. {
  45. GetNetProcess();
  46. CalcBagFlow();
  47. this.Invoke(new Action(() =>
  48. {
  49. status.Text = string.Format("信息:IP:{0},上传流量:{1},下载流量:{2}",
  50. IP, ByteConvertTool.Fmt(NetWorkService.NowSent), ByteConvertTool.Fmt(NetWorkService.NowReceived));
  51. status.Text += string.Format("\n单位时间:{0}分钟,上传流量:{1},下载流量:{2}",
  52. NetWorkService.ThresholdTime, ByteConvertTool.Fmt(NetWorkService.UnitSent), ByteConvertTool.Fmt(NetWorkService.UnitReceived));
  53. 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"));
  54. if ((NetWorkService.UnitSent + NetWorkService.UnitReceived) < NetWorkService.FlowThreshold || DateTime.Now > MaxTime)
  55. {
  56. NetWorkService.WriteRecord(BeginTime, DateTime.Now, netProcesses, IP);
  57. this.Dispose();
  58. }
  59. }));
  60. Thread.Sleep(1000);
  61. }
  62. }
  63. catch { }
  64. });
  65. CaptureInit();
  66. Task.Factory.StartNew(() => { try { _rs.Capture(); } catch { } });
  67. #endregion
  68. }
  69. #region 抓包过程
  70. private void CaptureInit()
  71. {
  72. _rs = new NativeSocket2(IPAddress.Parse(IP));
  73. _rs.IsStart = true;
  74. _rs.OnIPPacketCapure = (IPPacket tp) =>
  75. {
  76. this.Invoke(new Action(() =>
  77. {
  78. try
  79. {
  80. if (tp.SrcAddr.ToString() == IP)
  81. {
  82. //源地址是本机-从本机发出
  83. lock (netProcesses)
  84. {
  85. foreach (var item in netProcesses)
  86. {
  87. int inPort = item.Ports.Where(x => x.Port == tp.SrcPort).Count(); ;
  88. if (inPort > 0)
  89. {
  90. item.UpBag++;
  91. if (item.UpBag > 1000) item.UpBag = 0;
  92. NowBag++;
  93. }
  94. }
  95. }
  96. }
  97. if (tp.DestAddr.ToString() == IP)
  98. {
  99. //目标地址是本机-本机接收
  100. lock (netProcesses)
  101. {
  102. foreach (var item in netProcesses)
  103. {
  104. int inPort = item.Ports.Where(x => x.Port == tp.DestPort).Count(); ;
  105. if (inPort > 0)
  106. {
  107. item.DownBag++;
  108. if (item.DownBag > 1000) item.DownBag = 0;
  109. NowBag++;
  110. }
  111. }
  112. }
  113. }
  114. }
  115. catch { }
  116. }));
  117. };
  118. }
  119. #endregion
  120. #region 联网进程
  121. private void GetNetProcess()
  122. {
  123. foreach (var item in NetProcessAPI.GetAllTcpConnections())
  124. {
  125. AddTCPNetProcess(item);
  126. }
  127. foreach (var item in NetProcessAPI.GetAllUdpConnections())
  128. {
  129. AddUDPNetProcess(item);
  130. }
  131. }
  132. private void AddTCPNetProcess(TcpRow item)
  133. {
  134. try
  135. {
  136. var _netProcess = netProcesses.FirstOrDefault(x => x.ProcessID == item.owningPid);
  137. if (_netProcess == null)
  138. {
  139. _netProcess = new NetProcess() { ProcessID = item.owningPid, ProcessName = ProcessAPI.GetProcessNameByPID(item.owningPid) };
  140. netProcesses.Add(_netProcess);
  141. }
  142. if (_netProcess.Ports.FirstOrDefault(x => x.Port == item.LocalPort) == null)
  143. {
  144. _netProcess.ProcessICon = ProcessAPI.GetIcon(item.owningPid, true);
  145. }
  146. _netProcess.Ports.Add(GetTcpProcessPort(item));
  147. }
  148. catch (Exception e)
  149. {
  150. }
  151. }
  152. private void AddUDPNetProcess(UdpRow item)
  153. {
  154. try
  155. {
  156. var _netProcess = netProcesses.FirstOrDefault(x => x.ProcessID == item.owningPid);
  157. if (_netProcess == null)
  158. {
  159. _netProcess = new NetProcess() { ProcessID = item.owningPid, ProcessName = ProcessAPI.GetProcessNameByPID(item.owningPid) };
  160. netProcesses.Add(_netProcess);
  161. }
  162. if (_netProcess.Ports.FirstOrDefault(x => x.Port == item.LocalPort) == null)
  163. {
  164. _netProcess.ProcessICon = ProcessAPI.GetIcon(item.owningPid, true);
  165. _netProcess.Ports.Add(GetUDPProcessPort(item));
  166. }
  167. }
  168. catch (Exception e)
  169. {
  170. }
  171. }
  172. private ProcessPort GetTcpProcessPort(TcpRow tr)
  173. {
  174. ProcessPort _pp = new ProcessPort()
  175. {
  176. LocalAddress = tr.LocalAddress.ToString(),
  177. Port = tr.LocalPort,
  178. RemoteAddress = tr.RemoteAddress.ToString(),
  179. Type = ProtocolType.TCPType,
  180. RemotePort = tr.RemotePort,
  181. };
  182. return _pp;
  183. }
  184. private ProcessPort GetUDPProcessPort(UdpRow tr)
  185. {
  186. ProcessPort _pp = new ProcessPort()
  187. {
  188. LocalAddress = tr.LocalAddress.ToString(),
  189. Port = tr.LocalPort,
  190. RemoteAddress = "",
  191. Type = ProtocolType.UDPType,
  192. RemotePort = 0,
  193. };
  194. return _pp;
  195. }
  196. #endregion
  197. #region 矫正流量
  198. private void CalcBagFlow()
  199. {
  200. lock (netProcesses)
  201. {
  202. foreach (var pro in netProcesses)
  203. {
  204. long temp = pro.UpBag + pro.DownBag;
  205. double rate = 0;
  206. if (NowBag > 0 && temp > 0)
  207. rate = (double)temp / (double)NowBag;
  208. pro.UpLoad = (long)(NetWorkService.NowSent * rate);
  209. pro.DownLoad = (long)(NetWorkService.NowReceived * rate);
  210. pro.UpLoadCount += pro.UpLoad;
  211. pro.DownLoadCount += pro.DownLoad;
  212. pro.UpBag = 0;
  213. pro.DownBag = 0;
  214. }
  215. }
  216. NowBag = 0;
  217. }
  218. #endregion
  219. #region 获取IP
  220. public string GetIP()
  221. {
  222. IPHostEntry myEntry = Dns.GetHostEntry(Dns.GetHostName());
  223. return myEntry.AddressList.FirstOrDefault<IPAddress>(e => e.AddressFamily.ToString().Equals("InterNetwork")).ToString();
  224. }
  225. #endregion
  226. }
  227. }