Domanda

Ehi, sto provando a utilizzare un programma di controllo delle porte scritto in Visual Studio 2008 utilizzando 3,5 SP 1 .Net Framework e mi sembra di avere un problema usando il mio programma su sistemi operativi basati su Vista (in questo caso il sistema operativo attuale è Windows 2008 Server (sia macchine a 32 che a 64 bit) mentre funziona comunque bene su macchine XP. Non sono del tutto sicuro di quale sia il problema, ma ottengo un'eccezione System.NotSupportedException. Qualche idea su come posso modificare il seguente codice (o preferibilmente la configurazione della macchina) per consentire questo tipo di controllo delle porte?

    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;
    }
È stato utile?

Soluzione

Si è scoperto che il problema era:

Dns.GetHostAddresses (" localhost ");

Restituisce 2 indirizzi IP su Windows 2008 Server. Il primo è " :: 1 " e il secondo è l'IP reale. Se qualcuno sa perché questo (dal momento che non riesco a dare un senso al ritorno " :: 1 ") lo apprezzerei, altrimenti, solo afferrare l'ultimo IP dell'elenco sembra funzionare.

Altri suggerimenti

:: 1 è l'indirizzo di loopback IPv6. Il tuo codice fallisce perché usi AddressFamily.InterNetwork invece di AddressFamily.InternetWorkV6.

Vista + ha IPv6 in esecuzione per impostazione predefinita. È un'opzione di configurazione separata per XP / 2003.

Credo che ci siano due indirizzi IP restituiti su Windows 2008 Server perché uno è IPv4 e l'altro è l'indirizzo IPv6.

" Quando una stringa vuota viene passata come nome host, questo metodo restituisce gli indirizzi IPv4 dell'host locale per tutti i sistemi operativi tranne Windows Server 2003; per Windows Server 2003, vengono restituiti gli indirizzi IPv4 e IPv6 per l'host locale. " Src: http://msdn.microsoft.com/ it-it / library / system.net.dns.gethostaddresses.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top