.NET Framework での名前解決方法
先日 WinSock での名前解決方法を示しました。(「非同期名前解決ダイアログ」 など) 今回は .NET Framework での名前解決例を示します。
名前解決は System.Net.Dns クラスのメソッドを使うことで簡単に実現可能です。
自分のコードを探すと、次のようなコードが見つかりました。(後述の通り、このコードは後で直します)
using System; using System.Net; using System.Net.Sockets; class MyTest { static void PrintHostInfo (string sHost) { IPHostEntry hostEntry; hostEntry = Dns.Resolve (sHost); Console.WriteLine ("Canonical Name: {0}", hostEntry.HostName); Console.WriteLine("IP Address:"); foreach (IPAddress ipaddr in hostEntry.AddressList ) { Console.WriteLine (ipaddr.ToString()); } Console.WriteLine ("Aliases:"); foreach(string alias in hostEntry.Aliases) { Console.WriteLine (alias); } } static void Main(string[] args) { foreach (string sHost in args) { Console.WriteLine ( "----- {0} -----", sHost ); PrintHostInfo (sHost); } } }
これをコンパイルすると次のように、警告が出ました。
> csc ipaddressexample.cs Microsoft (R) Visual C# 2008 Compiler version 3.5.30729.1 for Microsoft (R) .NET Framework version 3.5 Copyright (C) Microsoft Corporation. All rights reserved. IPAddressExample.cs(11,15): warning CS0618: 'System.Net.Dns.Resolve(string)' is obsolete: 'Resolve is obsoleted for this type, please use GetHostEntry instead. http://go.microsoft.com/fwlink/?linkid=14202'
要は、System.Net.Dns.Resolve メソッドは古いので、Dns.GetHostEntry メソッドを使え、ということらしいです。 引数も戻り値も変らないので、ただメソッド名を書き換えるだけです。
そこで、書き換えた新しいバージョンは次の通り。
using System; using System.Net; using System.Net.Sockets; class MyTest { static void PrintHostInfo (string sHost) { IPHostEntry hostEntry; hostEntry = Dns.GetHostEntry (sHost); Console.WriteLine ("Canonical Name: {0}", hostEntry.HostName); Console.WriteLine("IP Address:"); foreach (IPAddress ipaddr in hostEntry.AddressList ) { Console.WriteLine (ipaddr.ToString()); } Console.WriteLine ("Aliases:"); foreach(string alias in hostEntry.Aliases) { Console.WriteLine (alias); } } static void Main(string[] args) { foreach (string sHost in args) { Console.WriteLine ( "----- {0} -----", sHost ); PrintHostInfo (sHost); } } }
これで名前解決を行うことが出来ました。
しかしながら、これもブロックするので今後出来れば、非同期の非ブロックの方法を紹介したいと思ってます。