Pergunta

Olá, eu estou tentando usar um programa de porta verificação escrito em Visual Studio 2008 usando o 3.5 SP 1 .Net Framework, e eu parecem ter um problema com o meu programa no Vista com base (neste caso, o sistema operacional real do OS é Windows 2008 Server (ambos 32 e 64 máquinas bit)), enquanto ele faz no entanto funcionam bem em máquinas XP. Eu não sou inteiramente certo qual é o problema, mas eu recebo um System.NotSupportedException. Alguma idéia de como eu posso mudar o código a seguir (ou de preferência a configuração da máquina) para permitir este tipo de verificação de porta?

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

Solução

Acontece que o problema era:

Dns.GetHostAddresses ( "localhost");

Retorna 2 Endereços IP no Windows 2008 Server. O primeiro é ":: 1" e o segundo é o IP real. Se alguém sabe por que isso é (uma vez que eu não posso fazer sentido do retorno ":: 1") que eu aprecio isso, caso contrário, apenas pegar o último IP da lista parece funcionar.

Outras dicas

:: 1 é o endereço IPv6 loopback. Seu código falha porque você usa AddressFamily.InterNetwork vez de AddressFamily.InternetWorkV6.

Vista + tem IPv6 em execução por padrão. É uma opção de configuração separado para XP / 2003.

Creio que existem dois endereços IP devolvidos no Windows 2008 Server porque um é IPv4 eo outro é o endereço IPv6.

"Quando uma cadeia vazia é passado como o nome do host, esse método retorna os endereços IPv4 do host local para todos os sistemas operacionais, exceto o Windows Server 2003; para o Windows Server 2003, ambos os endereços IPv4 e IPv6 para o host local são devolvidos ". Src: http://msdn.microsoft.com/ en-us / library / system.net.dns.gethostaddresses.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top