문제

안녕하세요, 3.5 SP 1 .NET 프레임 워크를 사용하여 Visual Studio 2008에서 작성된 포트 점검 프로그램을 사용하려고합니다. Vista 기반 OS (이 경우 실제 OS는 Windows 2008입니다. 서버 (32 및 64 비트 머신)) XP 머신에서는 잘 작동합니다. 나는 문제가 무엇인지 완전히 확신하지 못하지만 시스템을 얻지 못했습니다. 이러한 유형의 포트 점검을 허용하기 위해 다음 코드 (또는 바람직하게는 기계 구성)를 변경할 수있는 방법에 대한 아이디어가 있습니까?

    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 서버에서 2 개의 IP 주소를 반환합니다. 첫 번째는 ":: 1"이고 두 번째는 실제 IP입니다. 누구든지 이것이 왜 ( ":: 1"return을 이해할 수 없기 때문에) 왜 그런지에 감사드립니다. 그렇지 않으면 목록의 마지막 IP를 잡는 것이 작동하는 것 같습니다.

다른 팁

:: 1은 IPv6 루프백 주소입니다. 주소가 주소를 사용하여 주소를 사용하기 때문에 코드가 실패합니다.

Vista+는 기본적으로 IPv6을 실행합니다. XP/2003에 대한 별도의 구성 옵션입니다.

하나는 IPv4이고 다른 하나는 IPv6 주소이기 때문에 Windows 2008 서버에 반환 된 두 개의 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