确定服务器是否正在侦听给定端口

时间:2010-05-14 18:34:56

标签: c# .net networking sockets tcp

我需要轮询服务器,该服务器运行一些专有软件,以确定此服务是否正在运行。使用wireshark,我已经能够缩小其使用的TCP端口,但似乎流量已加密。

在我的情况下,可以肯定的是,如果服务器正在接受连接(即telnet serverName 1234),则服务已启动且一切正常。换句话说,我不需要进行任何实际的数据交换,只需打开一个连接然后安全地关闭它。

我想知道如何使用C#和Sockets来模拟它。我的网络编程基本上以WebClient结束,所以非常感谢这里的任何帮助。

4 个答案:

答案 0 :(得分:6)

这个过程实际上非常简单。

using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
    try
    {
        socket.Connect(host, port);
    }
    catch (SocketException ex)
    {
        if (ex.SocketErrorCode == SocketError.ConnectionRefused) 
        {
            // ...
        }
    }
}

答案 1 :(得分:3)

只需使用TcpClient尝试连接服务器,如果连接失败,TcpClient.Connect将抛出异常。

bool IsListening(string server, int port)
{
    using(TcpClient client = new TcpClient())
    {
        try
        {
            client.Connect(server, port);
        }
        catch(SocketException)
        {
            return false;
        }
        client.Close();
        return true;
    }
}

答案 2 :(得分:2)

我使用了以下代码。有一点需要注意......在高事务环境中,客户端的可用端口可能会耗尽,因为操作系统不会以与.NET代码发布的速率相同的速率释放套接字。

如果有人有更好的主意,请发帖。我已经看到雪球问题出现在服务器无法再进行传出连接的地方。我正在研究一个更好的解决方案...

public static bool IsServerUp(string server, int port, int timeout)
    {
        bool isUp;

        try
        {
            using (TcpClient tcp = new TcpClient())
            {
                IAsyncResult ar = tcp.BeginConnect(server, port, null, null);
                WaitHandle wh = ar.AsyncWaitHandle;

                try
                {
                    if (!wh.WaitOne(TimeSpan.FromMilliseconds(timeout), false))
                    {
                        tcp.EndConnect(ar);
                        tcp.Close();
                        throw new SocketException();
                    }

                    isUp = true;
                    tcp.EndConnect(ar);
                }
                finally
                {
                    wh.Close();
                }
            } 
        }
        catch (SocketException e)
        {
            LOGGER.Warn(string.Format("TCP connection to server {0} failed.", server), e);
            isUp = false;
        }

        return isUp;

答案 3 :(得分:0)

使用TcpClient类连接服务器。