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

编程开发
316
c#
端口占用
查询占用端口进程

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

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

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;
}
C#控制台程序右上角的关闭按钮怎么屏蔽
使用C#为MP3文件添加封面、专辑和歌手信息的实例教程
多线程使用Image.FromFile 加载图片时出现图片文件被锁定无法更新
C# 实现对windows防火墙的常规操作管理白名单、黑名单
C# 将数组分组进行平均拆分成多个数组 代码如何实现
vs编译时报错 不安全代码只会在使用 /unsafe 编译的情况下出现
.NET5框架下使用HttpListener类实现http接口监听替代OWIN自我寄宿
C# 二维码生成源码|使用ThoughtWorks.QRCode 实现根据文本内容生成二维码
 C# 实现 Rsa字符串非对称加密简单例子
VS错误提示无法嵌入互操作类型“IWshShell_ClassClass”,请改用适用的接口的解决方法
C# 操作DOS添加端口防火墙名单
C# 中使用const 常量可能会出现的版本更新问题!
暂无相关内容...
基于.NET4.0实现的目录文件新增监视并自动化上传至ftp完整流程工具源码
[人脸检测]基于C#OpenCvSharp+haarcascade人脸、人眼模型实现人脸检测源码
.NET5+C# WPF实现图片添加倾斜文字平铺水印工具源码
C#基于OpenCVSharp实现图片对比相似度百分比源码下载
C#结合虫洞软件(Wormhole)实现自动登录到手机版百度网盘的流程源码
免责声明 部分转载分享内容若侵犯您的权益,还请 邮件联系 侵删