.NET TIPS

ローカル・コンピュータのIPアドレスを取得するには?[C#、VB]

デジタルアドバンテージ 一色 政彦
2008/08/21

 ローカル・コンピュータのIPアドレス(文字列)を取得する方法は、.NET Framework 2.0以降と1.xで処理が異なる。本TIPSではそれぞれについて説明する。

IPアドレスを取得する方法(.NET Framework 2.0以降)

 IPアドレスを取得するには、Dnsクラス(System.Net名前空間)の静的メソッドGetHostAddressesを使う(TIPS:IPアドレス←→ホスト名を変換するには?」のように静的メソッドGetHostEntryを使ってもよい)。Dns.GetHostAddressesメソッドは、引数としてホスト名を取り、戻り値としてIPAddressクラス(System.Net名前空間)の配列オブジェクトを返す。

 引数として指定するローカル・コンピュータのホスト名は、「TIPS:プログラムを実行しているマシンのホスト名を得るには?」で説明されているように、Dnsクラスの静的メソッドGetHostNameを使えばよい。Dns.GetHostNameメソッドは、引数なしで、戻り値としてホスト名を返す。

 そして実際にIPアドレスの文字列を取得するには、Dns.GetHostAddressesメソッドで得た配列に含まれる1つのIPAddressオブジェクトを文字列化(=ToStringメソッドの呼び出し)すればよい。ここで得られる文字列は、インターネット上の標準表記で、IPv4の場合はピリオド区切りの10進表記、IPv6の場合はコロン区切りの16進表記となる。

 なお、メソッドの戻り値がIPAddressオブジェクトの配列になっているのは、1つのコンピュータで複数のIPアドレスを持つこともできるからである。しかし通常のクライアント・コンピュータではそのような状況はほとんどないだろう。

 次のコードは、以上の内容を実装したコンソール・アプリケーションのサンプル・プログラムだ。

using System;
using System.Net;

class Program
{
  static void Main(string[] args)
  {
    // ホスト名を取得する
    string hostname = Dns.GetHostName();

    // ホスト名からIPアドレスを取得する
    IPAddress[] adrList = Dns.GetHostAddresses(hostname);
    foreach (IPAddress address in adrList)
    {
      Console.WriteLine(address.ToString());
    }

    // ▼筆者の環境での出力結果:▼
    // 192.168.0.102
  }
}
Imports System.Net

Module Module1

  Sub Main()

    ' ホスト名を取得する
    Dim hostname As String = Dns.GetHostName()

    ' ホスト名からIPアドレスを取得する
    Dim adrList As IPAddress() = Dns.GetHostAddresses(hostname)
    For Each address As IPAddress In adrList
      Console.WriteLine(address.ToString())
    Next

    ' ▼筆者の環境での出力結果:▼
    ' 192.168.0.102

  End Sub

End Module
IPアドレスを取得するサンプル・コード(.NET Framework 2.0以降)(上:C#、下:VB)

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

IPアドレスを取得する方法(.NET Framework 1.x)

 .NET Framework 1.xでも、基本的な処理は.NET Framework 2.0以降の場合と変わらない。しかし、Dns.GetHostAddressesメソッドが2.0以降にしか搭載されていないので、代わりにDnsクラスの静的メソッドGetHostByNameを使う必要がある(逆に2.0ではこのメソッドはobsoletedになっているので使えない)。

 Dns.GetHostByNameメソッドは、引数としてホスト名を取り、戻り値としてIPHostEntryクラス(System.Net名前空間)のオブジェクトを返す。

 引数として指定するホスト名を取得するには(.NET Framework 2.0と同じく)Dns.GetHostNameメソッドを使えばよい。

 戻り値として得たIPHostEntryオブジェクトのAddressListプロパティからIPAddressオブジェクトの配列が取得できる。従って、あとは(.NET Framework 2.0の場合と同じように)配列に含まれる1つのIPAddressオブジェクトからIPアドレスの文字列を取得すればよい。

 次のコードは、以上の手順で実装したIPアドレスを取得するサンプル・プログラムである。

using System;
using System.Net;

class Class1
{
  [STAThread]
  static void Main(string[] args)
  {
    // ホスト名を取得する
    string hostname = Dns.GetHostName();

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

    // ▼筆者の環境での出力結果:▼
    // 192.168.0.102
  }
}
Imports System.Net

Module Module1

  Sub Main()

    ' ホスト名を取得する
    Dim hostname As String = Dns.GetHostName()

    ' ホスト名からIPアドレスを取得する
    Dim ipInfo As IPHostEntry = Dns.GetHostByName(hostname)
    Dim adress As IPAddress
    For Each adress In ipInfo.AddressList
      Console.WriteLine(adress.ToString())
    Next

    ' ▼筆者の環境での出力結果:▼
    ' 192.168.0.102

  End Sub

End Module
IPアドレスを取得するサンプル・コード(.NET Framework 1.x以降)(上:C#、下:VB)

 .NET Framework 1.xのコードも同期処理である。非同期に処理するには、Dns.BeginGetHostByNameメソッドとDns.EndGetHostByNameメソッドを使えばよい。これらのメソッドを使った方法は本稿では割愛する。詳しい利用方法については、MSDNの情報を参照してほしい。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ネットワーク
使用ライブラリ:Dnsクラス(System.Net名前空間)
使用ライブラリ:IPAddressクラス(System.Net名前空間)
使用ライブラリ:IPHostEntryクラス(System.Net名前空間)

この記事と関連性の高い別の.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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH