2013-09-26 30 views
2

我需要測試TCP端口是否空閒。我寫了這個方法:測試本地TCP端口是否空閒

private bool freePort(int port) { 
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    IAsyncResult result = socket.BeginConnect(IPAddress.Loopback, port, null, null); 
    bool success = result.AsyncWaitHandle.WaitOne(1000, true); 
    try{ 
     socket.Close(); 
    }catch(Exception){} 
    return !success; 
} 

這適用於Windows 7,但不適用於Windows XP。

在WinXP有時工作,有時提供虛假答案...

+0

如果沒有其他人有一個好主意,你可以檢查是否可以打開一個套接字到該端口。它可以給出不同的結果,具體取決於您用來引用自己的地址。 – 2013-09-26 09:36:34

+0

其他80%的時間會發生什麼?這是非常錯誤的代碼,如果你發現它是免費的,那麼你不能保證它在一納秒之後仍然可用,另一個進程可能會打開這個端口。 Windows之後的同類邏輯沒有檢查文件是否被鎖定的功能。 –

+0

好吧,它不能100%確定,但我需要在運行apache進程之前進行檢查。如果某些東西已經在運行並在tcp 80上偵聽,我可以獲取並停止進程。問題是爲什麼在XP有時工作,有時不工作。 – Tobia

回答

1

這可能是更好的正是嘗試什麼Apache會嘗試:打開端口,而不是連接到它。

using (var listener = new TcpListener(IPAddress.Loopback, port)) 
    listener.Start();