『QQ:1353814576』

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


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

C#执行DOS命令匹配获取指定端口被哪个进程 占用

        /// <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;
        }