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 是否在其中即可。

Guess you like

Origin blog.csdn.net/mzl87/article/details/121404562