Проблема с сокетом Vista в Visual Studio 2008

Привет, я пытаюсь использовать программу проверки портов, написанную в 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;
    }

person Community    schedule 11.09.2009    source источник
comment
Где возникает исключение?   -  person Matt Davis    schedule 12.09.2009
comment
Я думаю, что это проблема с брандмауэром Vista.   -  person    schedule 12.09.2009
comment
Брандмауэр отключается при возникновении проблемы. Исключение должно быть создано на socket.Connect, но я не уверен в точном местоположении в этом случае, поскольку единственная машина, на которой мне нужно тестировать, - это XP, которая принимает этот код.   -  person    schedule 14.09.2009
comment
Проблема возникает, когда я использую: (IPAddress) Dns.GetHostAddresses (localhost) [0]; вместо того, чтобы возвращать что-то вроде 127.0.0.1, я получаю :: 1   -  person    schedule 15.09.2009


Ответы (3)


Оказывается, проблема заключалась в следующем:

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

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

person Community    schedule 16.09.2009

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

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

person EricLaw    schedule 16.09.2009

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

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

person Community    schedule 16.09.2009