宇宙仮面の
C# Programming

 
Image

DNS 名前解決


開発環境: Visual Studio 2003

次のような機能のForm アプリケーションを作る。

  • ホスト名から IP Address に変換し、ComboBox に表示する。
  • IP Addressから ホスト名に変換する。
  • 変換できずにタイムアウトが発生する可能性があるので、変換時には ウェイトカーソルにする。
  • ホスト名、IPAdress のフォーマットが不正な場合には、ダイアログを表示す。
Image

この例では、www.yahoo.co.jp に複数のIP アドレスが割り振られているのがわかる。

実行形式とソースコード一式のダウンロード 注意: テスト用です。ダウンロードしないでください。

ソースコードはコメントを参照。
以下ソースコード。
2002/4/28 OnByName メソッドで例外発生時に ComboBox の描画を再開できないバグを修正。

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;

namespace TestDNS
{
        /// <summary>
        /// Form1 の概要の説明です。
        /// </summary>
        public class TestDNS : System.Windows.Forms.Form
        {
                private System.Windows.Forms.Button ButtonByAddress;
                private System.Windows.Forms.Button ButtonByName;
                private System.Windows.Forms.TextBox hostName;
                private System.Windows.Forms.Label label1;
                private System.Windows.Forms.ComboBox combIPAddress;
                private System.Windows.Forms.Label label2;
                /// <summary>
                /// 必要なデザイナ変数です。
                /// </summary>
                private System.ComponentModel.Container components = null;

                public TestDNS()
                {
                        //
                        // Windows フォーム デザイナ サポートに必要です。
                        //
                        InitializeComponent();

                        //
                        // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
                        //
                }

                /// <summary>
                /// 使用されているリソースに後処理を実行します。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if (components != null) 
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
                /// コード エディタで変更しないでください。
                /// </summary>
                private void InitializeComponent()
                {
                        this.ButtonByAddress = new System.Windows.Forms.Button();
                        this.ButtonByName = new System.Windows.Forms.Button();
                        this.hostName = new System.Windows.Forms.TextBox();
                        this.label1 = new System.Windows.Forms.Label();
                        this.combIPAddress = new System.Windows.Forms.ComboBox();
                        this.label2 = new System.Windows.Forms.Label();
                        this.SuspendLayout();
                        // 
                        // ButtonByAddress
                        // 
                        this.ButtonByAddress.Location = new System.Drawing.Point(272, 64);
                        this.ButtonByAddress.Name = "ButtonByAddress";
                        this.ButtonByAddress.Size = new System.Drawing.Size(32, 32);
                        this.ButtonByAddress.TabIndex = 1;
                        this.ButtonByAddress.Text = "←";
                        this.ButtonByAddress.MouseDown += new System.Windows.Forms.MouseEventHandler(this.OnByAddress);
                        // 
                        // ButtonByName
                        // 
                        this.ButtonByName.Location = new System.Drawing.Point(272, 16);
                        this.ButtonByName.Name = "ButtonByName";
                        this.ButtonByName.Size = new System.Drawing.Size(32, 32);
                        this.ButtonByName.TabIndex = 2;
                        this.ButtonByName.Text = "→";
                        this.ButtonByName.MouseDown += new System.Windows.Forms.MouseEventHandler(this.OnByName);
                        // 
                        // hostName
                        // 
                        this.hostName.Location = new System.Drawing.Point(24, 48);
                        this.hostName.Name = "hostName";
                        this.hostName.Size = new System.Drawing.Size(232, 19);
                        this.hostName.TabIndex = 3;
                        this.hostName.Text = "Hostname";
                        // 
                        // label1
                        // 
                        this.label1.Location = new System.Drawing.Point(336, 16);
                        this.label1.Name = "label1";
                        this.label1.Size = new System.Drawing.Size(128, 16);
                        this.label1.TabIndex = 5;
                        this.label1.Text = "IP Addresses";
                        // 
                        // combIPAddress
                        // 
                        this.combIPAddress.Location = new System.Drawing.Point(336, 48);
                        this.combIPAddress.Name = "combIPAddress";
                        this.combIPAddress.Size = new System.Drawing.Size(128, 20);
                        this.combIPAddress.TabIndex = 6;
                        this.combIPAddress.Text = "xxx.xxx.xxx.xxx";
                        // 
                        // label2
                        // 
                        this.label2.Location = new System.Drawing.Point(24, 16);
                        this.label2.Name = "label2";
                        this.label2.Size = new System.Drawing.Size(128, 16);
                        this.label2.TabIndex = 7;
                        this.label2.Text = "Host Name";
                        // 
                        // TestDNS
                        // 
                        this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
                        this.ClientSize = new System.Drawing.Size(496, 126);
                        this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                                                                                                  this.label2,
                                                                                                                                                  this.combIPAddress,
                                                                                                                                                  this.label1,
                                                                                                                                                  this.hostName,
                                                                                                                                                  this.ButtonByName,
                                                                                                                                                  this.ButtonByAddress});
                        this.Name = "TestDNS";
                        this.Text = "TestDNS";
                        this.ResumeLayout(false);

                }
                #endregion

                /// <summary>
                /// アプリケーションのメイン エントリ ポイントです。
                /// </summary>
                [STAThread]
                static void Main() 
                {
                        Application.Run(new TestDNS());
                }

                private void OnByAddress(object sender, System.Windows.Forms.MouseEventArgs e)
                {
                        Cursor cursor = this.Cursor;
                        try 
                        {
                                // カーソルを WaitCursor にする。
                                this.Cursor = Cursors.WaitCursor;
                                System.Net.IPHostEntry ipEntry = System.Net.Dns.GetHostByAddress(this.combIPAddress.Text);
                                this.hostName.Text = ipEntry.HostName;
                        }
                        catch (System.Exception exc)
                        {
                                // フォーマットエラーなどの例外処理
                                MessageBox.Show(exc.Message, "TestDNS", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }
                        finally 
                        {
                                // カーソルを元に戻す。
                                this.Cursor = cursor;
                        }
                }

                private void OnByName(object sender, System.Windows.Forms.MouseEventArgs e)
                {
                        Cursor cursor = this.Cursor;
                        try 
                        {
                                // カーソルを WaitCursor にする。
                                this.Cursor = Cursors.WaitCursor;
                                System.Net.IPHostEntry ipEntry = System.Net.Dns.GetHostByName(this.hostName.Text);
                                // ちらつきを防止するために描画を停止する。
                                this.combIPAddress.BeginUpdate();
                                // リストボックスをクリアする。
                                this.combIPAddress.Items.Clear();
                                foreach (IPAddress i in ipEntry.AddressList)
                                {
                                        this.combIPAddress.Items.Add( i.ToString() ); 
                                }
                                this.combIPAddress.Text = this.combIPAddress.Items[0].ToString();

                        }
                        catch (System.Exception exc)
                        {
                                // フォーマットエラーなどの例外処理
                                MessageBox.Show(exc.Message, "TestDNS", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }
                        finally 
                        {
                                // 停止していた描画を再開する。
                                this.combIPAddress.EndUpdate();
                                // カーソルを元に戻す。
                                this.Cursor = cursor;
                        }               
                }
        }
}