.NET TIPS

IPアドレス←→ホスト名を変換するには?[2.0のみ、C#、VB]

デジタルアドバンテージ 一色 政彦
2006/02/24

 IPアドレスからホスト名を取得したり、逆にホスト名からIPアドレスを取得したりするには、Dnsクラス(System.Net名前空間)を使用する。

 .NET Framework 1.xでこれを行うには、「TIPS:プログラムを実行しているマシンのホスト名を得るには?」でも紹介されているように、Dns.GetHostByAddressメソッド(=IPアドレスからホスト名を取得)もしくはDns.GetHostByNameメソッド(=ホスト名からIPアドレスを取得)を使用すればよい。

 例えば、次のようなコードを実行すればよい。

using System;
using System.Net;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      // IPアドレスからホスト名を取得する
      string ipAddress = "192.168.0.102";
      IPHostEntry hostInfo = Dns.GetHostByAddress(ipAddress);
      Console.WriteLine(hostInfo.HostName);

      // ホスト名からIPアドレスを取得する
      string hostName = "dapc89";
      IPHostEntry ipInfo = Dns.GetHostByName(hostName);
      foreach (IPAddress ipInfoAddress in ipInfo.AddressList)
      {
        Console.WriteLine(ipInfoAddress);
      }

      // ▼筆者の環境での出力結果:▼
      // dapc89.d-advantage.com
      // 192.168.0.102
    }
  }
}
Imports System.Net

Module Module1

  Sub Main()
    ' IPアドレスからホスト名を取得する
    Dim ipAddress As String = "192.168.0.102"
    Dim hostInfo As IPHostEnTry = Dns.GetHostByAddress(ipAddress)
    Console.WriteLine(hostInfo.HostName)

    ' ホスト名からIPアドレスを取得する
    Dim hostName As String = "dapc89"
    Dim ipInfo As IPHostEnTry = Dns.GetHostByName(hostName)
    Dim ipInfoAddress As IPAddress
    For Each ipInfoAddress In ipInfo.AddressList
      Console.WriteLine(ipInfoAddress)
    Next

    ' ▼筆者の環境での出力結果:▼
    ' dapc89.d-advantage.com
    ' 192.168.0.102
  End Sub

End Module
.NET Framework 1.x用のIPアドレス←→ホスト名を変換するサンプル・プログラム(上:C#、下:VB)

 しかしこれらのメソッドを.NET Framework 2.0上で利用すると、(エラーにはならないものの)次のような警告がコンパイル時に表示されてしまう(作成されたexeファイルは実行可能)。

'System.Net.Dns.GetHostByAddress(string)' は古い形式です: 'GetHostByAddress is obsoleted for this type, please use GetHostEntry instead. http://go.microsoft.com/fwlink/?linkid=14202'  ……省略……

'System.Net.Dns.GetHostByName(string)' は古い形式です: 'GetHostByName is obsoleted for this type, please use GetHostEntry instead. http://go.microsoft.com/fwlink/?linkid=14202'  ……省略……
Dns.GetHostByAddressメソッドとDns.GetHostByNameメソッドの.NET Framework 2.0上での警告

 これは、これらのメソッドがすでに廃れたもの(obsoleted)であることを示している(これについては「TIPS:不要となった古いクラスやメソッドを残すには?」が参考になる)。つまり、.NET Framework 2.0でこのメソッドを利用することは推奨されていないことを意味する。上記の警告からも分かるように、これらのメソッドの代わりとしては、.NET Framework 2.0で新しく追加されたDns.GetHostEntryメソッドの使用が推奨されている。

 そこで先ほどのDns.GetHostByAddressメソッドとDns.GetHostByNameメソッドをDns.GetHostEntryメソッドに書き換えて、.NET Framework 2.0に対応させたのが次のコードだ。

using System;
using System.Net;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      // IPアドレスからホスト名を取得する
      string ipAddress = "192.168.0.102";
      IPHostEntry hostInfo = Dns.GetHostEntry(ipAddress);
      Console.WriteLine(hostInfo.HostName);

      // ホスト名からIPアドレスを取得する
      string hostName = "dapc89";
      IPHostEntry ipInfo = Dns.GetHostEntry(hostName);
      foreach (IPAddress ipInfoAddress in ipInfo.AddressList)
      {
        Console.WriteLine(ipInfoAddress);
      }

      // ▼筆者の環境での出力結果:▼
      // dapc89.d-advantage.com
      // 192.168.0.102
    }
  }
}
Imports System.Net

Module Module1

  Sub Main()
    ' IPアドレスからホスト名を取得する
    Dim ipAddress As String = "192.168.0.102"
    Dim hostInfo As IPHostEntry = Dns.GetHostEntry(ipAddress)
    Console.WriteLine(hostInfo.HostName)

    ' ホスト名からIPアドレスを取得する
    Dim hostName As String = "dapc89"
    Dim ipInfo As IPHostEntry = Dns.GetHostEntry(hostName)
    Dim ipInfoAddress As IPAddress
    For Each ipInfoAddress In ipInfo.AddressList
      Console.WriteLine(ipInfoAddress)
    Next

    ' ▼筆者の環境での出力結果:▼
    ' dapc89.d-advantage.com
    ' 192.168.0.102
  End Sub

End Module
.NET Framework 2.0用のIPアドレス←→ホスト名を変換するサンプル・プログラム(上:C#、下:VB)

 このコードでは、.NET Framework 2.0でコンパイルしても警告は表示されない。

 ただしこのコードは同期処理(=メソッドの処理が完了するまで制御が戻らないため、ほかの操作ができない)になっているので、ネットワークが遅かったりすると、アプリケーション全体の動作が停止してしまう。それを避けるために非同期で同様の処理を実現するには、Dns.BeginGetHostEntryメソッドとDns.EndGetHostEntryメソッドを使えばよい。これらのメソッドを使った方法は本稿では割愛するが、詳しい利用方法については、MSDNの情報を参照してほしい。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ネットワーク
使用ライブラリ:Dnsクラス(System.Net名前空間)
使用ライブラリ:IPHostEntryクラス(System.Net名前空間)
関連TIPS:プログラムを実行しているマシンのホスト名を得るには?
関連TIPS:不要となった古いクラスやメソッドを残すには?

この記事と関連性の高い別の.NET TIPS
ローカル・コンピュータのIPアドレスを取得するには?
メソッドやプロパティの有無を確認して呼び出すには?
プログラムを実行しているマシンのホスト名を得るには?
ファイルやディレクトリの一覧を効率的に取得するには?
マシン名/ユーザー名を取得するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間