C#如何检查端口是否正在监听?

5
我使用以下代码来实现这个目标:

    public static bool IsServerListening()
    {
        var endpoint = new IPEndPoint(IPAddress.Parse("201.212.1.167"), 2593);
        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        try
        {
            socket.Connect(endpoint, TimeSpan.FromSeconds(5));
            return true;
        }
        catch (SocketException exception)
        {
            if (exception.SocketErrorCode == SocketError.TimedOut)
            {
                Logging.Log.Warn("Timeout while connecting to UO server game port.", exception);
            }
            else
            {
                Logging.Log.Error("Exception while connecting to UO server game port.", exception);
            }

            return false;
        }
        catch (Exception exception)
        {
            Logging.Log.Error("Exception while connecting to UO server game port.", exception);
            return false;
        }
        finally
        {
            socket.Close();
        }
    }

这是我对Socket类的扩展方法:

public static class SocketExtensions
{
    public const int CONNECTION_TIMEOUT_ERROR = 10060;

    /// <summary>
    /// Connects the specified socket.
    /// </summary>
    /// <param name="socket">The socket.</param>
    /// <param name="endpoint">The IP endpoint.</param>
    /// <param name="timeout">The connection timeout interval.</param>
    public static void Connect(this Socket socket, EndPoint endpoint, TimeSpan timeout)
    {
        var result = socket.BeginConnect(endpoint, null, null);

        bool success = result.AsyncWaitHandle.WaitOne(timeout, true);
        if (!success)
        {
            socket.Close();
            throw new SocketException(CONNECTION_TIMEOUT_ERROR); // Connection timed out.
        }
    }
}

这段代码在我的开发环境中可以正常工作,但当我将其移到生产环境中时,它总是超时(无论我将超时间隔设置为5或20秒)。

是否有其他方法可以检查该IP地址是否正在特定端口上进行监听?

为什么我不能从我的托管环境中执行此操作的原因是什么?


生产网络中处于活动状态的防火墙很容易解释这个问题。您正在公共IP上使用一个不寻常的端口号。 - Hans Passant
你为什么要使用精确的IP地址? 通常情况下,System.Net.IPAddress.Any是更好的解决方案,它可以监听所有IP地址(如果这是可接受的)。 - Matej
因为我想检查那个IP是否在那个端口上监听? - bevacqua
2个回答

12

我已经更新了答案 - .NET解决方案中的netstat -na是在IPGlobalProperties上使用GetActiveTcpListenersGetActiveTcpConnections - Matej
但我想要在特定的IP上监听,而不是本地IP。 - bevacqua
我的回答展示了如何检查监听端口 - 你应该在服务器端进行检查,而你的示例代码是客户端。正如@Hans所提到的,防火墙通常会阻止非允许连接。 - Matej
这样做没有意义,我想要检查服务器是否在线并且在该端口上监听,它可能已经关闭了,而且有一个网站应该报告服务器的状态。 - bevacqua
从连接的角度来看,您的客户端检查代码是正确的。您能否手动检查服务器是否正在侦听,防火墙是否已正确配置以及您是否可以使用telnet、putty或其他工具从本地控制台连接到指定的TPC端口。 - Matej
让我们在聊天中继续这个讨论 - Matej

3
您可以使用以下代码进行检查:
       TcpClient tc = new TcpClient();
       try
       {

           tc.Connect(<server ipaddress>, <port number>);
           bool stat = tc.Connected;
           if (stat)
               MessageBox.Show("Connectivity to server available."); 

           tc.Close();
       }
       catch(Exception ex)
       {
           MessageBox.Show("Not able to connect : " + ex.Message);
           tc.Close();
       }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接