Проблема с сокетом в Visual Studio 2008 Vista - PullRequest
0 голосов
/ 11 сентября 2009

Привет, я пытаюсь использовать программу проверки портов, написанную в Visual Studio 2008 с использованием 3.5 SP 1 .Net Framework, и у меня, похоже, возникла проблема с использованием моей программы в ОС на базе Vista (в данном случае реальной ОС). Windows Server 2008 (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;
    }

Ответы [ 3 ]

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

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

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

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

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

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

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

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

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

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

...