c # Проверка, активно ли порт слушает? - PullRequest
2 голосов
/ 10 сентября 2011

Я использую следующий фрагмент кода для достижения этой цели:

    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 активно прослушивает этот конкретный порт?

В чем причина, почему я не могу сделать это из среды хостинга?

Ответы [ 2 ]

7 голосов
/ 10 сентября 2011

Вы можете запустить netstat -na из командной строки, чтобы увидеть все (включая прослушивание) порты.

Если вы добавите -b, вы также увидите связанный исполняемый файл для каждого соединения / прослушивания.

В .NET вы можете получить все соединения для прослушивания с System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()

0 голосов
/ 16 сентября 2011

Вы можете проверить это, используя этот код:

       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();
       }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...