C# 如何判断某个 tcp 端口是否被占用?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 如何判断某个 tcp 端口是否被占用?相关的知识,希望对你有一定的参考价值。

咨询区

  • 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 connections
            var connections = properties.GetActiveTcpConnections();
            avalaiblePorts.AddRange(connections);

            // Active tcp listners
            var endPointsTcp = properties.GetActiveTcpListeners();
            avalaiblePorts.AddRange(endPointsTcp);

            // Active udp listeners
            var 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 successful
                    Console.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 是否在其中即可。

以上是关于C# 如何判断某个 tcp 端口是否被占用?的主要内容,如果未能解决你的问题,请参考以下文章

VC++获取系统TCPUDP端口使用信息,并判断端口是否被占用(附源码)

Linux如何查询哪些端口被占用

Linux如何查询哪些端口被占用

Linux如何查询哪些端口被占用

Linux如何查询哪些端口被占用

查看linux中某个端口是否被占用