22 / 12 / 15
参考链接:链接1
public static DataTable GetProcessPorts2()
{
DataTable dtportinfo = new DataTable();
dtportinfo.Columns.Add("pid", typeof(int));
dtportinfo.Columns.Add("name");
dtportinfo.Columns.Add("port_count", typeof(int));
dtportinfo.Columns.Add("ports");
dtportinfo.PrimaryKey = new DataColumn[] { dtportinfo.Columns["pid"] };
Dictionary<int, List<int>> portinfo = null;
//存放进程使用的端口号链表
//List<int> ports = new List<int>();
try
{
portinfo = new Dictionary<int, List<int>>();
Process pro = new Process();
pro.StartInfo.FileName = "cmd.exe";
pro.StartInfo.UseShellExecute = false;
pro.StartInfo.RedirectStandardInput = true;
pro.StartInfo.RedirectStandardOutput = true;
pro.StartInfo.RedirectStandardError = true;
pro.StartInfo.CreateNoWindow = true;
pro.Start();
pro.StandardInput.WriteLine("netstat -ano");
pro.StandardInput.WriteLine("exit");
Regex reg = new Regex("\\s+", RegexOptions.Compiled);
string line = null;
//ports.Clear();
while ((line = pro.StandardOutput.ReadLine()) != null)
{
line = line.Trim();
if (line.StartsWith("TCP", StringComparison.OrdinalIgnoreCase))
{
line = reg.Replace(line, ",");
string[] arr = line.Split(',');
string soc = arr[1];
int pos = soc.LastIndexOf(':');
int pot = int.Parse(soc.Substring(pos + 1));
int pid = int.Parse(arr[4]);
if (portinfo.ContainsKey(pid))
{
if (!portinfo[pid].Contains(pot))
{
portinfo[pid].Add(pot);
DataRow dr = dtportinfo.Rows.Find(pid);
dr["port_count"] = Convert.ToInt32(dr["port_count"].ToString()) + 1;
dr["ports"] = dr["ports"].ToString() + $",{pot}";
}
}
else
{
List<int> ls = new List<int>();
ls.Add(pot);
portinfo.Add(pid, ls)
DataRow dr = dtportinfo.NewRow();
dr["pid"] = pid;
dr["port_count"] = 1;
dr["ports"] = $"{pot}";
dtportinfo.Rows.Add(dr);
}
}
else if (line.StartsWith("UDP", StringComparison.OrdinalIgnoreCase))
{
line = reg.Replace(line, ",");
string[] arr = line.Split(',');
string soc = arr[1];
int pos = soc.LastIndexOf(':');
int pot = int.Parse(soc.Substring(pos + 1));
int pid = int.Parse(arr[3]);
if (portinfo.ContainsKey(pid))
{
if (!portinfo[pid].Contains(pot))
{
portinfo[pid].Add(pot);
DataRow dr = dtportinfo.Rows.Find(pid);
dr["port_count"] = Convert.ToInt32(dr["port_count"].ToString()) + 1;
dr["ports"] = dr["ports"].ToString() + $",{pot}";
}
}
else
{
List<int> ls = new List<int>();
ls.Add(pot);
portinfo.Add(pid, ls);
DataRow dr = dtportinfo.NewRow();
dr["pid"] = pid;
dr["port_count"] = 1;
dr["ports"] = $"{pot}";
dtportinfo.Rows.Add(dr);
}
}
}
pro.Close();
}
catch (Exception exp)
{
}
return dtportinfo;
}
Process p = Process.GetProcessById(pid);
dr["name"] = p.ProcessName;
p.Close();