文章代码核心逻辑就是用 C# Process类 启动 cmd.exe执行dos命令,通过执行
netstat -ano拿到所有网络连接和对应的进程 ID,再从结果里找出目标端口对应的进程,最后通过进程 ID 查出具体是哪个程序,适用于一些需要占用端口的程序启动时判断加以提示。
C#实现查询某个端口是被哪个程序进程占用
逻辑实现思路
具体实现:利用System.Diagnostics.Process类启动一个 CMD 进程,执行netstat -ano命令来获取所有网络连接及其对应的进程 ID 信息,然后在结果中查找指定端口的占用情况,提取出对应的进程 ID,再通过Process.GetProcessById方法获取进程对象,进而得到进程相关信息。
代码逻辑实现
////// 执行dos命令脚本 /// /// /// public string ExecCMD(string command) { System.Diagnostics.Process pro = new System.Diagnostics.Process(); pro.StartInfo.FileName = "cmd.exe"; pro.StartInfo.UseShellExecute = false; pro.StartInfo.RedirectStandardError = true; pro.StartInfo.RedirectStandardInput = true; pro.StartInfo.RedirectStandardOutput = true; pro.StartInfo.CreateNoWindow = true; //pro.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; pro.Start(); pro.StandardInput.WriteLine(command); pro.StandardInput.WriteLine("exit"); pro.StandardInput.AutoFlush = true; //获取cmd窗口的输出信息 string output = pro.StandardOutput.ReadToEnd(); pro.WaitForExit();//等待程序执行完退出进程 pro.Close(); return output; } /// /// 获取占用端口的进程 /// /// /// public Process UsePortWithProcess(int port) { try { ///执行多事获取端口信息 string cmd_response = ExecCMD("netstat -ano"); byte[] txt = System.Text.UTF8Encoding.UTF8.GetBytes(cmd_response.ToCharArray()); using (Stream readStream = new MemoryStream(txt)) { readStream.Position = 0; using (StreamReader reader = new StreamReader(readStream)) { ///正则表达式 用于提取信息 Regex reg = new Regex(" \\s+ ", RegexOptions.Compiled); string line = null; while ((line = reader.ReadLine()) != null) { line = line.Trim(); ///提取需要的端口相关信息行 if (line.StartsWith("TCP", StringComparison.OrdinalIgnoreCase)) { line = reg.Replace(line, ","); string[] arr = line.Split(','); if (arr[1].EndsWith($":{port}")) { int pid = Int32.Parse(arr[4]); Process p = Process.GetProcessById(pid); return p; } } } } } } catch (Exception ex) { } return null; }