Program.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using SharpPcap;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Text;
  8. using System.Text.RegularExpressions;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. namespace Test.NetFlowMonitor
  12. {
  13. class Program
  14. {
  15. public static ProcessPerformanceInfo ProcInfo { get; set; }
  16. static void Main(string[] args)
  17. {
  18. #region 第一步 获取指定进程使用的所有端口号
  19. Process p = Process.GetProcessesByName("Firefox")[0];
  20. ProcInfo = new ProcessPerformanceInfo();
  21. ProcInfo.ProcessID = p.Id;
  22. ProcInfo.ProcessName = p.ProcessName;
  23. //进程id
  24. int pid = ProcInfo.ProcessID;
  25. //存放进程使用的端口号链表
  26. List<int> ports = new List<int>();
  27. #region 获取指定进程对应端口号
  28. Process pro = new Process();
  29. pro.StartInfo.FileName = "cmd.exe";
  30. pro.StartInfo.UseShellExecute = false;
  31. pro.StartInfo.RedirectStandardInput = true;
  32. pro.StartInfo.RedirectStandardOutput = true;
  33. pro.StartInfo.RedirectStandardError = true;
  34. pro.StartInfo.CreateNoWindow = true;
  35. pro.Start();
  36. pro.StandardInput.WriteLine("netstat -ano");
  37. pro.StandardInput.WriteLine("exit");
  38. Regex reg = new Regex("\\s+", RegexOptions.Compiled);
  39. string line = null;
  40. ports.Clear();
  41. while ((line = pro.StandardOutput.ReadLine()) != null)
  42. {
  43. line = line.Trim();
  44. if (line.StartsWith("TCP", StringComparison.OrdinalIgnoreCase))
  45. {
  46. line = reg.Replace(line, ",");
  47. string[] arr = line.Split(',');
  48. if (arr[4] == pid.ToString())
  49. {
  50. string soc = arr[1];
  51. int pos = soc.LastIndexOf(':');
  52. int pot = int.Parse(soc.Substring(pos + 1));
  53. ports.Add(pot);
  54. }
  55. }
  56. else if (line.StartsWith("UDP", StringComparison.OrdinalIgnoreCase))
  57. {
  58. line = reg.Replace(line, ",");
  59. string[] arr = line.Split(',');
  60. if (arr[3] == pid.ToString())
  61. {
  62. string soc = arr[1];
  63. int pos = soc.LastIndexOf(':');
  64. int pot = int.Parse(soc.Substring(pos + 1));
  65. ports.Add(pot);
  66. }
  67. }
  68. }
  69. pro.Close();
  70. #endregion
  71. #endregion
  72. #region 第二步 获取本机IP地址和本机网络设备(即网卡)
  73. //获取本机IP地址
  74. IPAddress[] addrList = Dns.GetHostByName(Dns.GetHostName()).AddressList;
  75. string IP = addrList[0].ToString();
  76. //获取本机网络设备
  77. var devices = CaptureDeviceList.Instance;
  78. int count = devices.Count;
  79. if (count < 1)
  80. {
  81. Console.WriteLine("No device found on this machine");
  82. return;
  83. }
  84. #endregion
  85. #region 第三步 开始抓包
  86. //开始抓包
  87. for (int i = 0; i < count; ++i)
  88. {
  89. for (int j = 0; j < ports.Count; ++j)
  90. {
  91. CaptureFlowRecv(IP, ports[j], i);
  92. CaptureFlowSend(IP, ports[j], i);
  93. }
  94. }
  95. #endregion
  96. while (true)
  97. {
  98. Console.WriteLine("proc NetTotalBytes : " + ProcInfo.NetTotalBytes);
  99. Console.WriteLine("proc NetSendBytes : " + ProcInfo.NetSendBytes);
  100. Console.WriteLine("proc NetRecvBytes : " + ProcInfo.NetRecvBytes);
  101. //每隔1s调用刷新函数对性能参数进行刷新
  102. RefershInfo();
  103. }
  104. //最后要记得调用Dispose方法停止抓包并关闭设备
  105. ProcInfo.Dispose();
  106. }
  107. public static void CaptureFlowSend(string IP, int portID, int deviceID)
  108. {
  109. ICaptureDevice device = (ICaptureDevice)CaptureDeviceList.New()[deviceID];
  110. device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrivalSend);
  111. int readTimeoutMilliseconds = 1000;
  112. device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);
  113. string filter = "src host " + IP + " and src port " + portID;
  114. device.Filter = filter;
  115. device.StartCapture();
  116. ProcInfo.dev.Add(device);
  117. }
  118. public static void CaptureFlowRecv(string IP, int portID, int deviceID)
  119. {
  120. ICaptureDevice device = CaptureDeviceList.New()[deviceID];
  121. device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrivalRecv);
  122. int readTimeoutMilliseconds = 1000;
  123. device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);
  124. //string filter = "dst host " + IP + " and dst port " + portID;
  125. //device.Filter = filter;
  126. device.StartCapture();
  127. ProcInfo.dev.Add(device);
  128. }
  129. private static void device_OnPacketArrivalSend(object sender, CaptureEventArgs e)
  130. {
  131. var len = e.Packet.Data.Length;
  132. ProcInfo.NetSendBytes += len;
  133. Console.WriteLine("NowUp={0} Up: {1}KB Down: {2}KB", e.Packet.Data.Length, ProcInfo.NetSendBytes / 1024, ProcInfo.NetRecvBytes / 1024);
  134. }
  135. private static void device_OnPacketArrivalRecv(object sender, CaptureEventArgs e)
  136. {
  137. var len = e.Packet.Data.Length;
  138. ProcInfo.NetRecvBytes += len;
  139. Console.WriteLine("NowDown={0} Up: {1}KB Down: {2}KB", e.Packet.Data.Length, ProcInfo.NetSendBytes / 1024, ProcInfo.NetRecvBytes / 1024);
  140. }
  141. /// <summary>
  142. /// 实时刷新性能参数
  143. /// </summary>
  144. public static void RefershInfo()
  145. {
  146. ProcInfo.NetRecvBytes = 0;
  147. ProcInfo.NetSendBytes = 0;
  148. ProcInfo.NetTotalBytes = 0;
  149. Thread.Sleep(1000);
  150. ProcInfo.NetTotalBytes = ProcInfo.NetRecvBytes + ProcInfo.NetSendBytes;
  151. }
  152. }
  153. }