咨询区
Ali:
在 C# 中使用 TcpClient 或者其他通用的方式建立的 Socket,请问我如何判断这个端口是否被占用?
比如下面的代码:
TcpClient c;
//I want to check here if port is free.
c = new TcpClient(ip, port);
回答区
jro:
如果你用 TcpClient 建立的连接,在 System.Net.NetworkInformation
命名空间下有很多种方式去判断端口是否被占用,比如说 IPGlobalProperties
类就可以获取一组 TcpConnectionInformation
对象,然后在这个数组中获取它的 IP 和 Port。
参考如下代码:
public static void Main(string[] args){IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0];try{var port = 666;if (isPortAvalaible(port)){TcpListener tcpListener = new TcpListener(ipAddress, port);tcpListener.Start();}}catch (Exception ex){Console.WriteLine(ex.Message);}}private static bool isPortAvalaible(int myPort){var avalaiblePorts = new List<int>();var properties = IPGlobalProperties.GetIPGlobalProperties();// Active connectionsvar connections = properties.GetActiveTcpConnections();avalaiblePorts.AddRange(connections);// Active tcp listnersvar endPointsTcp = properties.GetActiveTcpListeners();avalaiblePorts.AddRange(endPointsTcp);// Active udp listenersvar endPointsUdp = properties.GetActiveUdpListeners();avalaiblePorts.AddRange(endPointsUdp);foreach (int p in avalaiblePorts){if (p == myPort) return false;}return true;}
Mohsen:
其实你可以通过 try catch
的方式来判断端口是否被占用,SocketException
下的 10048 状态码就表示 端口占用异常
, 参考如下代码:
public static void Main(string[] args){string hostname = "localhost";int portno = 9081;IPAddress ipa = (IPAddress)Dns.GetHostAddresses(hostname)[0];try{System.Net.Sockets.Socket sock = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);sock.Connect(ipa, portno);if (sock.Connected == true){// Port is in use and connection is successfulConsole.WriteLine("Port is Closed");}sock.Close();}catch (System.Net.Sockets.SocketException ex){if (ex.ErrorCode == 10061){ // Port is unused and could not establish connection Console.WriteLine("Port is Open!");}else{Console.WriteLine(ex.Message);}}}
点评区
虽然用异常的方式简单粗暴,但这种用异常来处理业务逻辑是不推荐的做法,更加高效的当然就是先获取本机所有的可用端口,然后判断当前 port 是否在其中即可。