When we are going to create a tcp/udp Server connection, we need a port ranging from 1000 to 65535. However, a port can only be monitored by one program, so we need to detect if the port is occupied when we listen locally. The namespace System.Net.NetworkInformation defines a class named Ipglobalproperties, which we use to get all the listening connections and then determine if the ports are occupied.
1 //----------------------------------------------------------------------------- 2 //Filename:FreePort.cs3 // 4 //Description:helper methods to find the next free UDP and TCP ports.5 // 6 //History :7 //Clauson Aaron Copied fromhttp://www.mattbrindley.com/developing/windows/net/detecting-the-next-available-free-tcp-port/. 8 //-----------------------------------------------------------------------------9 Ten usingSystem; One usingSystem.Collections.Generic; A usingSystem.Linq; - usingSystem.Net; - usingSystem.Net.NetworkInformation; the usingSystem.Text; - usingSystem.Threading; - - namespaceSIPSorcery.Sys.Net + { - Public classFreePort + { A Private Const stringPortreleaseguid ="8875bd8e-4d5b-11de-b2f4-691756d89593"; at - /// <summary> - ///Check If Startport is available, incrementing and - ///checking again if it ' s in use until a free port is found - /// </summary> - /// <param name= "Startport" >The first port to check</param> in /// <returns>The first available port</returns> - Public Static intFindnextavailabletcpport (intstartport) to { + intPort =Startport; - BOOLIsAvailable =true; the * varMutex =NewMutex (false, $ string. Concat ("global/", Portreleaseguid)); Panax Notoginseng mutex. WaitOne (); - Try the { +Ipglobalproperties ipglobalproperties = A ipglobalproperties.getipglobalproperties (); theipendpoint[] Endpoints = + ipglobalproperties.getactivetcplisteners (); - $ Do $ { - if(!isavailable) - { theport++; -IsAvailable =true; Wuyi } the - foreach(IPEndPoint EndPointinchendpoints) Wu { - if(Endpoint.port! = Port)Continue; AboutIsAvailable =false; $ Break; - } - -} while(!isavailable && Port <ipendpoint.maxport); A + if(!isavailable) the Throw NewApplicationException ("Not able to find a free TCP port."); - $ returnPort; the } the finally the { the mutex. ReleaseMutex (); - } in } the the /// <summary> About ///Check If Startport is available, incrementing and the ///checking again if it ' s in use until a free port is found the /// </summary> the /// <param name= "Startport" >The first port to check</param> + /// <returns>The first available port</returns> - Public Static intFindnextavailableudpport (intstartport) the { Bayi intPort =Startport; the BOOLIsAvailable =true; the - varMutex =NewMutex (false, - string. Concat ("global/", Portreleaseguid)); the mutex. WaitOne (); the Try the { theIpglobalproperties ipglobalproperties = - ipglobalproperties.getipglobalproperties (); theipendpoint[] Endpoints = the ipglobalproperties.getactiveudplisteners (); the 94 Do the { the if(!isavailable) the { 98port++; AboutIsAvailable =true; - }101 102 foreach(IPEndPoint EndPointinchendpoints)103 { 104 if(Endpoint.port! =Port) the Continue; 106IsAvailable =false; 107 Break; 108 }109 the} while(!isavailable && Port <ipendpoint.maxport);111 the if(!isavailable)113 Throw NewApplicationException ("Not able to find a free TCP port."); the the returnPort; the } 117 finally 118 { 119 mutex. ReleaseMutex (); - } 121 } 122 } 123}
[Go] C # get the native available port