Question

Bonjour, j’essaie d’utiliser un programme de vérification des ports écrit dans Visual Studio 2008 à l’aide de .NET Framework 3.5 SP 1 et j’ai un problème avec l’utilisation de mon programme sur un système d’exploitation sous Vista (dans ce cas, le système d’exploitation actuel). est Windows 2008 Server (machines 32 et 64 bits)) alors que cela fonctionne cependant très bien sur les machines XP. Je ne suis pas tout à fait sûr du problème, mais je reçois une exception System.NotSupportedException. Des idées sur la façon dont je peux changer le code suivant (ou de préférence la configuration de la machine) pour permettre ce type de vérification de port?

    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;
    }
Était-ce utile?

La solution

Il s’est avéré que le problème était le suivant:

Dns.GetHostAddresses ("localhost");

Renvoie 2 adresses IP sur Windows 2008 Server. Le premier est " :: 1 " et le second est l'adresse IP réelle. Si quelqu'un sait pourquoi c'est (étant donné que je ne peux pas comprendre le retour "1)", je l'apprécierais, sinon, le simple fait de saisir la dernière adresse IP de la liste semble fonctionner.

Autres conseils

:: 1 est l'adresse de bouclage IPv6. Votre code échoue car vous utilisez AddressFamily.InterNetwork au lieu de AddressFamily.InternetWorkV6.

Vista + a IPv6 en cours d'exécution par défaut. C'est une option de configuration séparée pour XP / 2003.

Je pense que deux adresses IP ont été renvoyées sous Windows 2008 Server, l'une étant IPv4 et l'autre l'adresse IPv6.

" Lorsqu'une chaîne vide est passée en tant que nom d'hôte, cette méthode renvoie les adresses IPv4 de l'hôte local pour tous les systèmes d'exploitation, à l'exception de Windows Server 2003. pour Windows Server 2003, les adresses IPv4 et IPv6 de l'hôte local sont renvoyées. " Src: http://msdn.microsoft.com/ en-us / library / system.net.dns.gethostaddresses.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top