Вопрос

Привет, я пытаюсь использовать программу проверки портов, написанную в Visual Studio 2008 с использованием платформы .Net Framework 3.5 SP 1, и, похоже, у меня проблема с использованием моей программы в ОС на базе Vista (в данном случае фактической операционной системой является Windows 2008 Server (как 32, так и 64-разрядные машины)), хотя, тем не менее, она отлично работает на машинах XP.Я не совсем уверен, в чем проблема, но я получаю System.NotSupportedException.Есть идеи о том, как я могу изменить следующий код (или, предпочтительно, конфигурацию компьютера), чтобы обеспечить этот тип проверки портов?

    static bool IsPortOpen(int portNumber)
    {
        bool isOpen = false;
        IPAddress ip = (IPAddress)Dns.GetHostAddresses("localhost")[0];
        Socket s = null;

        try
        {
            s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, 
                 ProtocolType.Tcp))

            s.Connect(ip, portNumber);

            // Port is in use and connection is successful
            if (s.Connected == true)
            {
                isOpen = false;
            }
        }
        catch (SocketException exception)
        {
            // http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspx
            if (exception.ErrorCode == 10061)
            {
                isOpen = true;
            }
        }
        finally
        {
            if (s != null)
            {
                s.Close();
            }
        }

        return isOpen;
    }
Это было полезно?

Решение

Оказывается, проблема была в том, что:

Dns.GetHostAddresses("локальный хост");

Возвращает 2 IP-адреса на сервере Windows 2008.Первый - "::1", а второй - фактический IP-адрес.Если кто-нибудь знает, почему это так (поскольку я не могу понять смысл возврата ":: 1") Я был бы признателен, в противном случае, похоже, работает простой захват последнего IP-адреса из списка.

Другие советы

:: 1 - это адрес обратной связи IPv6. Ваш код не выполняется, потому что вы используете AddressFamily.InterNetwork вместо AddressFamily.InternetWorkV6.

В Vista + IPv6 работает по умолчанию. Это отдельная опция конфигурации для XP / 2003.

Я считаю, что на Windows 2008 Server возвращены два IP-адреса, потому что один - IPv4, а другой - IPv6-адрес.

" Когда в качестве имени хоста передается пустая строка, этот метод возвращает IPv4-адреса локального хоста для всех операционных систем, кроме Windows Server 2003; для Windows Server 2003 возвращаются адреса IPv4 и IPv6 для локального хоста. " Источник: http://msdn.microsoft.com/ ан-нас / библиотека / system.net.dns.gethostaddresses.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top