Visual Studio 2008 Vista 소켓 문제
-
06-07-2019 - |
문제
안녕하세요, 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