C#实现查询某个端口是被哪个程序进程占用

317
补充展位 Pages_Weblog_Get#0
文章摘要
此内容由人工摘要内容,并由AI根据文章内容进行润色
暂无内容

文章代码核心逻辑就是用 C# Process类 启动 cmd.exe执行dos命令,通过执行netstat -ano拿到所有网络连接和对应的进程 ID,再从结果里找出目标端口对应的进程,最后通过进程 ID 查出具体是哪个程序,适用于一些需要占用端口的程序启动时判断加以提示。

C#实现查询某个端口是被哪个程序进程占用

C#实现查询某个端口是被哪个程序进程占用

逻辑实现思路

具体实现:利用System.Diagnostics.Process类启动一个 CMD 进程,执行netstat -ano命令来获取所有网络连接及其对应的进程 ID 信息,然后在结果中查找指定端口的占用情况,提取出对应的进程 ID,再通过Process.GetProcessById方法获取进程对象,进而得到进程相关信息。

代码逻辑实现

/// <summary>
/// 执行dos命令脚本
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
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;

}

/// <summary>
/// 获取占用端口的进程
/// </summary>
/// <param name="port"></param>
/// <returns></returns>
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;
}
补充展位
Pages_Weblog_Get#b860f850-1481-48dc-876a-ad8300de5812
补充展位 Pages_Weblog_Get#1
补充展位 Pages_Weblog_Get#2
专题推荐
暂无内容
补充展位 Pages_Weblog_Get#3