2010-06-17 59 views
1

提前,感謝您的建議。C#檢測本地主機端口使用

我目前正在使用Putty與服務器建立SSH連接的程序,該服務器使用本地端口轉發來啓用運行我的軟件的客戶端,以通過本地主機訪問SSH服務器後面的服務。

IE:客戶:20100 - >網絡 - >通過路由器/防火牆暴露遠程SSH服務器 - >本地Intranet - >內部網POP3服務器:110。

CMD線: 「油灰-ssh -2 -P 22 -L -C 20100:intranteIP:110 -pw sshpassword sshusername @ sshserver」

客戶端會使用膩子創建與SSH服務器指定一個SSH連接在連接字符串中,它希望將Intranet POP3服務器的端口110綁定到客戶端系統上的端口20100。因此,客戶端將能夠打開郵件客戶端到localhost:20100,並通過SSH隧道與內部POP3服務器交互。以上是一般性描述。我已經知道我想要做的事情會毫無問題地工作,所以我不想在上面討論。

問題是這樣的...我如何能確保本地端口(我不能使用動態端口,因此它必須是靜態的)在本地主機上不使用或通過任何其他應用程序聽了?

我目前執行此代碼在我的C#應用​​程序:

private bool checkPort(int port) 
{ 
    try 
    { 
     //Create a socket on the current IPv4 address 
     Socket TestSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

     // Create an IP end point 
     IPEndPoint localIP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port); 

     // Bind that port 
     TestSocket.Bind(localIP); 

     // Cleanup 
     TestSocket.Close(); 

     return false; 
    } 
    catch (Exception e) 
    { 
     // Exception occurred. Port is already bound. 
     return true; 
    } 
} 

我目前正在調用這個函數開始,在一個特定的端口環獲得第一個可用端口的「假」的回報。我嘗試的第一個端口實際上是由uTorrent收聽的。上面的代碼沒有捕獲這個,我的連接失敗。

什麼是確保港口真正免費的最佳方法?我明白一些其他程序可能會在測試過程中/之後抓住端口。我只需要找到一些能夠確保在測試執行時目前不在使用的東西。

如果在測試過程中有一種方法可以真正保留localhost端口,我很樂意聽到它。

+0

知道我是否應該從膩子移動爲此,也許使用SharpSSH。任何其他良好的SSH源代碼的C#/ VB在那裏? – 2010-06-17 13:03:08

回答

3

Here's答案如何檢查本地端口是免費的。

我會推薦這種方式:

bool IsBusy(int port) 
{ 
    IPGlobalProperties ipGP = IPGlobalProperties.GetIPGlobalProperties(); 
    IPEndPoint[] endpoints = ipGlobalProperties.GetActiveTcpListeners(); 
    if (endpoints == null || endpoints.Length == 0) return false; 
    for(int i = 0; i < endpoints.Length; i++) 
     if (endpoints[i].Port == port) 
      return true; 
    return false;   
} 
+0

非常好,謝謝! – 2010-06-17 23:56:55

+0

不幸的是,該網站上的所有三個示例均未能檢測到uTorrent在起始端口上收聽。這太奇怪了。任何其他想法? – 2010-06-18 10:59:40

+0

你能顯示命令「netstat -anbp tcp」的輸出嗎?我對uTorrent.exe的行感興趣 – 2010-06-18 12:44:54

相關問題