C#實現檢查指定端口被哪個進程佔用

1. 檢查當前系統中80端口是否正在被其它進程使用;

2. 如果80端口正在被使用,就找出該進程,並強行結束。

3. 使用C#變成語言實現。

 

別人問我問題時,我通常會去google一下,幫他們找到一個合適的就行了,這次也不例外!但遺憾的是,沒有找到一個解決方案,於是寫下了這篇文章,希望能夠拋磚引玉,給網友們一些幫助,同時也希望能跟更多的朋友交流一下!

 

要解決第一個問題方法很直接,可以在程序中直接請求系統要綁定80端口, 如果綁定失敗(拋出異常)則表示80端口已經被佔用,這也是我在寫網絡程序時最常用的方法。

 

如果要檢查80端口在被哪一個進程所使用,可能要費點心思。做網絡的朋友應該十分熟悉一個命令:netstat -ano,在控制檯(CMD)運行該命令時,可以列出當前所佔用的所有端口,我們不妨也藉助與系統中所提供的這個命令,然後分析運行結果就行了!

 

簡單的解決方案如下:

1. 在程序中啓動一個新的進程,該進程的執行文件爲:CMD.EXE

2. 給該進程傳遞一個命令行參數:netstat -ano

3. 獲取該命令所返回的結果,並對其進行分析,找出端口爲80的進程ID(PID)

4. 根據PID找出該進程,可以對該進程進行任意的處理

 

C#實現代碼(既然是拋磚引玉,這裏代碼需要十分的簡潔,所以並沒有考慮任何錯誤處理問題,如果哪位朋友直接用到了工程中, 所引起的問題筆者不負任何責任):

 

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/-->
 
static void Main(string[] args) {
    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;
   
// 啓動CMD
    pro.Start();
   
// 運行端口檢查命令
    pro.StandardInput.WriteLine("netstat -ano");
    pro.StandardInput.WriteLine(
"exit");

   
// 獲取結果
    Regex reg =new Regex("\\s+", RegexOptions.Compiled);
   
string line=null;
   
while ((line= pro.StandardOutput.ReadLine())!=null) {
        line
= line.Trim();
       
if (line.StartsWith("TCP", StringComparison.OrdinalIgnoreCase)) {
            line
= reg.Replace(line,",");

           
string[] arr= line.Split(',');
           
if (arr[1].EndsWith(":80")) {
                Console.WriteLine(
"80端口的進程ID:{0}", arr[4]);

               
int pid= Int32.Parse(arr[4]);
                Process pro80
= Process.GetProcessById(pid);
               
// 處理該進程

               
break;
            }
        }
    }

    pro.Close();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章