|
.NET TIPS
プログラムを実行しているマシンのホスト名を得るには?
株式会社ピーデー 川俣 晶
2003/06/06 |
|
|
ネットワークを活用するプログラムを作成していると、そのプログラムを実行しているコンピュータの名前を参照する必要が生じることがある。そのような場合には、Dnsクラス(System.Net名前空間)のGetHostNameメソッドを使用することが、最も基本的な解決方法である。
Dns.GetHostNameメソッドで得る
使い方は難しくない。以下のような簡単なコードを書けばすぐに実行結果を確かめることができる。
// gethost1.cs
using System;
using System.Net;
class GetHostNameSample1 {
static void Main() {
Console.WriteLine(Dns.GetHostName());
}
}
// コンパイル方法:csc gethost1.cs
|
|
コンピュータの名前を表示するサンプル・プログラム(C#版:gethost1.cs) |
|
' gethost1.vb
Imports System
Imports System.Net
Module GetHostNameSample
Sub Main()
Console.WriteLine(Dns.GetHostName())
End Sub
End Module
' コンパイル方法:vbc /r:System.dll gethost1.vb
|
|
コンピュータの名前を表示するサンプル・プログラム(VB.NET版:gethost1.vb) |
|
しかし、これが意図するとおりの名前であるという保証はない。例えば、筆者のPCでこのサンプル・プログラムを実行すると、「tailmon3」と表示される。これは、マイコンピュータのプロパティで設定したこのコンピュータの名前である。しかし、このPCは、ActiveDirectoryサーバから「tailmon3.tokyo.piedey.co.jp」という名前をもらっている。通信に使用することを考えれば、前者の名前よりも後者の名前の方が有用である。もし、無関係なほかのコンピュータに取得した値を渡すとき、「tailmon3」という名前では、名前を解決できない可能性が高い。だが、FQDN(Fully Qualified Domain Name)名の「tailmon3.tokyo.piedey.co.jp」なら(これはプライベートLAN上の名前なので、この名前を解決できる範囲内ならば、という制約は付くが)、どこからでも解決できる。
単純にFQDN名を得る場合には、GetHostNameメソッドを記述している行を、以下のようにIPHostEntryクラス(System.Net名前空間)を使用して書き直せばよい。
IPHostEntry hostInfo = Dns.GetHostByName(Dns.GetHostName());
Console.WriteLine(hostInfo.HostName);
|
|
GetHostNameメソッドで得たコンピュータ名からFQDN名を得るコード(C#版) |
Dim hostInfo As IPHostEntry = Dns.GetHostByName(Dns.GetHostName())
Console.WriteLine(hostInfo.HostName)
|
|
GetHostNameメソッドで得たコンピュータ名からFQDN名を得るコード(VB.NET版) |
それでも上手く値を取得できないケース
上記のプログラムは完全ではない。というのは、矛盾した設定を持ったコンピュータの場合、正しくない結果を返す場合があるためである。
例えば、以下の条件を持ったコンピュータで上記のサンプル・プログラムを実行してみた。ほかの条件によっても動作が変わるかもしれないので、一例として見ていただきたい。
- コンピュータ名は「kukuri」
- コンピュータはActiveDirectoryの管理下にない
- コンピュータは固定IPアドレス「192.168.16.64」を与えられている
- DNSサーバには、「192.168.16.64」は「test2.tokyo.piedey.co.jp」であると正引き、逆引きともに設定されている。
この状態でGetHostByNameメソッドは「kukuri」という値を返した。また、IPHostEntryクラスのHostNameプロパティを利用した方法では「kukuri.tokyo.piedey.co.jp」という値を返した。DNSサーバには、「kukuri.tokyo.piedey.co.jp」という名前に関する情報はなく、これは処理不可能な名前である。適切なActiveDirectoryの管理が行われていれば問題ないと思われるが、すべて手動で固定値を与えていると、このような状況が起こる可能性も否定できない。
これを回避するには、1度自分のコンピュータのIPアドレスを取得してから、そのIPアドレスに対応するホスト名をDns.GetHostByAddressメソッドを使って得るとよいようである。
// gethost2.cs
using System;
using System.Net;
class GetHostNameSample2 {
static void Main() {
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
foreach (IPAddress ipAddress in ipHostInfo.AddressList) {
Console.WriteLine(Dns.GetHostByAddress(ipAddress).HostName);
}
}
}
// コンパイル方法:csc gethost2.cs
|
|
IPアドレスを取得してからホスト名を得るサンプル・プログラム(C#版:gethost2.cs) |
|
' gethost2.vb
Imports System
Imports System.Net
Module GetHostNameSample
Sub Main()
Dim ipHostInfo As IPHostEntry = Dns.Resolve(Dns.GetHostName())
Dim ipAddress As IPAddress
For Each ipAddress In ipHostInfo.AddressList
Console.WriteLine(Dns.GetHostByAddress(ipAddress).HostName)
Next
End Sub
End Module
' コンパイル方法:vbc /r:System.dll gethost2.vb
|
|
IPアドレスを取得してからホスト名を得るサンプル・プログラム(VB.NET版:gethost2.vb) |
|
これを実行すると、実際にDNSに登録されている「test2.tokyo.piedey.co.jp」という名前を得ることができた。この名前は、同じDNS情報を共有するほかのコンピュータから確実にこのコンピュータのIPアドレスを得るために使用できる。
カテゴリ:クラス・ライブラリ 処理対象:ネットワーク
使用ライブラリ:Dnsクラス(System.Net名前空間)
使用ライブラリ:IPHostEntryクラス(System.Net名前空間) |
|
generated by
|
|
Insider.NET 記事ランキング
本日
月間