Frage

Hallo, Ich versuche, einen Port zu verwenden Programm in Visual Studio geschrieben Überprüfung 2008 den 3.5 SP 1 .NET-Framework, und ich scheine ein Problem mit meinem Programm auf Vista-basierten Betriebssystemen zu haben (in diesem Fall des tatsächliche O ist Windows 2008 Server (beide 32 und 64-Bit-Maschinen)), während es jedoch fein auf XP-Rechnern funktioniert. Ich bin nicht ganz sicher, was das Problem ist, aber ich erhalte eine System.NotSupportedException. Alle Ideen, wie ich den folgenden Code ändern kann (oder vorzugsweise die Maschinenkonfiguration) für diese Art von Port-Kontrolle ermöglichen?

    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;
    }
War es hilfreich?

Lösung

Es stellte sich heraus das Problem war:

Dns.GetHostAddresses ( "localhost");

Gibt 2 IP-Adressen auf Windows 2008 Server. Die erste ist „:: 1“ und die zweite ist die tatsächliche IP. Wenn jemand weiß, warum das so ist (da ich nicht Sinn der „:: 1“ Rückkehr machen) Ich würde es zu schätzen wissen, sonst nur die letzte IP der Liste greifen scheint zu funktionieren.

Andere Tipps

:: 1 ist die IPv6-Loopback-Adresse. Ihr Code schlägt fehl, weil Sie AddressFamily.InterNetwork statt AddressFamily.InternetWorkV6 verwenden.

Vista + hat IPv6 standardmäßig ausgeführt wird. Es ist eine separate Konfigurationsoption für XP / 2003.

Ich glaube, es gibt zwei IP-Adressen zurück auf Windows 2008 Server, weil man ist IPv4 und das andere ist die IPv6-Adresse.

"Wenn eine leere Zeichenfolge als Hostname übergeben wird, gibt diese Methode die IPv4-Adressen des lokalen Hosts für alle Betriebssysteme mit Ausnahme von Windows Server 2003, Windows Server 2003, sowohl IPv4 als auch IPv6-Adressen für die lokale Host zurückgegeben werden .“ Src: http://msdn.microsoft.com/ en-us / library / system.net.dns.gethostaddresses.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top