Visual Studio 2008 Vistaソケットの問題
-
06-07-2019 - |
質問
やあ、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