Определите, прослушивает ли сервер данный порт - PullRequest
4 голосов
/ 14 мая 2010

Мне нужно опросить сервер, на котором запущено некоторое проприетарное программное обеспечение, чтобы определить, запущена ли эта служба. Используя wireshark, я смог сузить TCP-порт, который он использует, но похоже, что трафик зашифрован.

В моем случае можно поспорить, что, если сервер принимает соединения (например, telnet serverName 1234), служба работает и все в порядке. Другими словами, мне не нужно осуществлять какой-либо фактический обмен данными, просто откройте соединение и затем безопасно закройте его.

Мне интересно, как я могу эмулировать это с помощью C # и сокетов. Мое сетевое программирование в основном заканчивается WebClient, поэтому любая помощь здесь очень ценится.

Ответы [ 4 ]

6 голосов
/ 14 мая 2010

Процесс на самом деле очень прост.

using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
    try
    {
        socket.Connect(host, port);
    }
    catch (SocketException ex)
    {
        if (ex.SocketErrorCode == SocketError.ConnectionRefused) 
        {
            // ...
        }
    }
}
3 голосов
/ 14 мая 2010

Просто используйте 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 голосов
/ 30 сентября 2011

Я использовал следующий код. Есть одно предостережение ... в среде с высокими транзакциями доступные порты клиента могут исчерпаться, так как сокеты не освобождаются ОС с той же скоростью, что и код .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;
0 голосов
/ 14 мая 2010

Используйте класс TcpClient для подключения к серверу.

...