NetDetailForm.cs 10 KB

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