当我们要创建一个Tcp/UDP Server connection ,我们需要一个范围在1000到65535之间的端口 。但是本机一个端口只能一个程序监听,所以我们进行本地监听的时候需要检测端口是否被占用。命名空间System.Net.NetworkInformation下定义了一个名为IPGlobalProperties的类,我们使用这个类可以获取所有的监听连接,然后判断端口是否被占用。
1 //----------------------------------------------------------------------------- 2 // Filename: FreePort.cs 3 // 4 // Description: Helper methods to find the next free UDP and TCP ports. 5 // 6 // History: 7 // 28 Mar 2012 Aaron Clauson Copied from http://www.mattbrindley.com/developing/windows/net/detecting-the-next-available-free-tcp-port/. 8 //----------------------------------------------------------------------------- 9 10 using System; 11 using System.Collections.Generic; 12 using System.Linq; 13 using System.Net; 14 using System.Net.NetworkInformation; 15 using System.Text; 16 using System.Threading; 17 18 namespace SIPSorcery.Sys.Net 19 { 20 public class FreePort 21 { 22 private const string PortReleaseGuid = "8875BD8E-4D5B-11DE-B2F4-691756D89593"; 23 24 /// <summary> 25 /// Check if startPort is available, incrementing and 26 /// checking again if it‘s in use until a free port is found 27 /// </summary> 28 /// <param name="startPort">The first port to check</param> 29 /// <returns>The first available port</returns> 30 public static int FindNextAvailableTCPPort(int startPort) 31 { 32 int port = startPort; 33 bool isAvailable = true; 34 35 var mutex = new Mutex(false, 36 string.Concat("Global/", PortReleaseGuid)); 37 mutex.WaitOne(); 38 try 39 { 40 IPGlobalProperties ipGlobalProperties = 41 IPGlobalProperties.GetIPGlobalProperties(); 42 IPEndPoint[] endPoints = 43 ipGlobalProperties.GetActiveTcpListeners(); 44 45 do 46 { 47 if (!isAvailable) 48 { 49 port++; 50 isAvailable = true; 51 } 52 53 foreach (IPEndPoint endPoint in endPoints) 54 { 55 if (endPoint.Port != port) continue; 56 isAvailable = false; 57 break; 58 } 59 60 } while (!isAvailable && port < IPEndPoint.MaxPort); 61 62 if (!isAvailable) 63 throw new ApplicationException("Not able to find a free TCP port."); 64 65 return port; 66 } 67 finally 68 { 69 mutex.ReleaseMutex(); 70 } 71 } 72 73 /// <summary> 74 /// Check if startPort is available, incrementing and 75 /// checking again if it‘s in use until a free port is found 76 /// </summary> 77 /// <param name="startPort">The first port to check</param> 78 /// <returns>The first available port</returns> 79 public static int FindNextAvailableUDPPort(int startPort) 80 { 81 int port = startPort; 82 bool isAvailable = true; 83 84 var mutex = new Mutex(false, 85 string.Concat("Global/", PortReleaseGuid)); 86 mutex.WaitOne(); 87 try 88 { 89 IPGlobalProperties ipGlobalProperties = 90 IPGlobalProperties.GetIPGlobalProperties(); 91 IPEndPoint[] endPoints = 92 ipGlobalProperties.GetActiveUdpListeners(); 93 94 do 95 { 96 if (!isAvailable) 97 { 98 port++; 99 isAvailable = true; 100 } 101 102 foreach (IPEndPoint endPoint in endPoints) 103 { 104 if (endPoint.Port != port) 105 continue; 106 isAvailable = false; 107 break; 108 } 109 110 } while (!isAvailable && port < IPEndPoint.MaxPort); 111 112 if (!isAvailable) 113 throw new ApplicationException("Not able to find a free TCP port."); 114 115 return port; 116 } 117 finally 118 { 119 mutex.ReleaseMutex(); 120 } 121 } 122 } 123 }
时间: 2024-10-14 14:23:12