Web/DB プログラミング徹底解説

ホーム > 雑記帳 > .NET Framework での名前解決方法

.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);

          }
          
     }

}

これで名前解決を行うことが出来ました。

しかしながら、これもブロックするので今後出来れば、非同期の非ブロックの方法を紹介したいと思ってます。

スポンサーリンク