Pregunta

Hola, estoy tratando de usar un programa de verificación de puertos escrito en Visual Studio 2008 usando el 3.5 SP 1 .Net Framework, y parece que tengo un problema al usar mi programa en sistemas operativos basados ??en Vista (en este caso, el sistema operativo real es Windows 2008 Server (máquinas de 32 y 64 bits), aunque funciona bien en máquinas XP. No estoy completamente seguro de cuál es el problema, pero obtengo una excepción System.NotSupportedException. ¿Alguna idea sobre cómo puedo cambiar el siguiente código (o preferiblemente la configuración de la máquina) para permitir este tipo de comprobación de puerto?

    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;
    }
¿Fue útil?

Solución

Resulta que el problema era:

Dns.GetHostAddresses (" localhost ");

Devuelve 2 direcciones IP en Windows 2008 Server. El primero es " :: 1 " y el segundo es la IP real. Si alguien sabe por qué esto es así (ya que no puedo entender el " :: 1 " retorno), lo apreciaría, de lo contrario, el simple hecho de capturar la última IP de la lista parece funcionar.

Otros consejos

:: 1 es la dirección de bucle invertido de IPv6. Tu código falla porque usas AddressFamily.InterNetwork en lugar de AddressFamily.InternetWorkV6.

Vista + tiene IPv6 ejecutándose por defecto. Es una opción de configuración separada para XP / 2003.

Creo que hay dos direcciones IP devueltas en Windows 2008 Server porque una es IPv4 y la otra es la dirección IPv6.

" Cuando se pasa una cadena vacía como nombre de host, este método devuelve las direcciones IPv4 del host local para todos los sistemas operativos excepto Windows Server 2003; para Windows Server 2003, se devuelven las direcciones IPv4 e IPv6 para el host local. " Src: http://msdn.microsoft.com/ en-us / library / system.net.dns.gethostaddresses.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top