2011-05-04 200 views
8

檢查UDP端口是否在同一臺計算機上打開的最佳方法是什麼?我有端口號7525UDP,如果它打開,我想綁定到它。我正在使用這個代碼:UDP端口打開檢查

while (true) 
{ 

    try {socket.bind()} 

    catch (Exception ex) 

    {MessageBox.Show("socket probably in use");} 
} 

但是有一個指定的函數,可以檢查UDP端口是否打開。如果不清除爲UDP端口設置的整個表,那也不錯。

回答

18
int myport = 7525; 
bool alreadyinuse = (from p in System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners() where p.Port == myport select p).Count() == 1; 

評論如下建議其將提供第一個空閒的UDP端口的變化......但是,建議代碼效率低下,因爲它調用到外部組件多次(取決於有多少端口正在使用)。這裏有一個更有效的變化,這將只調用外部程序集一次(而且也更易讀):

var startingAtPort = 5000; 
    var maxNumberOfPortsToCheck = 500; 
    var range = Enumerable.Range(startingAtPort, maxNumberOfPortsToCheck); 
    var portsInUse = 
     from p in range 
      join used in System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners() 
       on p equals used.Port 
        select p; 

    var FirstFreeUDPPortInRange = range.Except(portsInUse).FirstOrDefault(); 

    if(FirstFreeUDPPortInRange > 0) 
    { 
     // do stuff 
     Console.WriteLine(FirstFreeUDPPortInRange); 
    } else { 
     // complain about lack of free ports? 
    } 
+0

:-)很好的接觸,雖然它不是什麼我一直在尋找,但它是未來最好的事情。當然,這項工作測試,它正在工作:-)謝謝。 – Thomas 2011-05-09 14:14:45

+0

從.NET 4開始,此方法適用於IP v4和IP v6。但是,如果您熟悉如何解釋MSDN文檔,則它只適用於所有舊.NET版本(如.NET 2.0/3.0/3.5)的IP v4。 – 2013-03-06 07:58:56

+0

認爲它應該是一個'> 0'比較在多個閱讀器的情況下。 – 2014-08-11 17:47:51