質問

やあ、3.5 SP 1 .Net Frameworkを使用してVisual Studio 2008で記述されたポートチェックプログラムを使用しようとしていますが、VistaベースのOS(この場合は実際のOS)でプログラムを使用すると問題があるようですWindows 2008 Server(32ビットマシンと64ビットマシンの両方)です。ただし、XPマシンでは正常に動作します。問題が何であるかは完全にはわかりませんが、System.NotSupportedExceptionが発生します。このタイプのポートチェックを可能にするために、次のコード(またはできればマシンの構成)を変更する方法についてのアイデアはありますか?

    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;
    }
役に立ちましたか?

解決

問題が判明した:

Dns.GetHostAddresses(" localhost");

Windows 2008 Serverで2つのIPアドレスを返します。 1つ目は" :: 1"です。 2番目は実際のIPです。これが理由を知っている人がいるなら(":1"リターンの意味が分からないので)感謝します。

他のヒント

:: 1はIPv6ループバックアドレスです。 AddressFamily.InternetWorkV6ではなくAddressFamily.InterNetworkを使用しているため、コードは失敗します。

Vista +では、デフォルトでIPv6が実行されています。 XP / 2003の個別の構成オプションです。

Windows 2008 Serverでは、一方がIPv4でもう一方がIPv6アドレスであるため、2つのIPアドレスが返されると思います。

"空の文字列がホスト名として渡されると、このメソッドはWindows Server 2003を除くすべてのオペレーティングシステムのローカルホストのIPv4アドレスを返します。 Windows Server 2003の場合、ローカルホストのIPv4アドレスとIPv6アドレスの両方が返されます。" Src: http://msdn.microsoft.com/ en-us / library / system.net.dns.gethostaddresses.aspx

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top