嘿那里,我正在尝试使用3.5 SP 1 .Net Framework在Visual Studio 2008中编写的端口检查程序,我似乎在基于Vista的操作系统上使用我的程序时出现问题(在这种情况下是实际操作系统)是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(QUOT;本地主机&QUOT);

在Windows 2008 Server上返回2个IP地址。第一个是“:: 1”。第二个是实际的IP。如果有人知道为什么会这样(因为我无法理解“:: 1”返回)我会很感激,否则,只需抓住列表的最后一个IP似乎就可以了。

其他提示

:: 1是IPv6环回地址。您的代码失败,因为您使用AddressFamily.InterNetwork而不是AddressFamily.InternetWorkV6。

Vista +默认运行IPv6。它是XP / 2003的独立配置选项。

我相信在Windows 2008 Server上有两个IP地址,因为一个是IPv4,另一个是IPv6地址。

"当空字符串作为主机名传递时,此方法返回除Windows Server 2003之外的所有操作系统的本地主机的IPv4地址;对于Windows Server 2003,将返回本地主机的IPv4和IPv6地址。 Src: http://msdn.microsoft.com/ EN-US /库/ system.net.dns.gethostaddresses.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top