用异步方式解析域名

类别:.NET开发 点击:0 评论:0 推荐:

C# NetWork Programming里面一个例子,通过异步的方式解析域名。主要是应用Dns类的BeginResolve(),和EndResolve()方法。此例子有一个问题就是当碰到解析不出来的域名时,不会调用AsyncCallback指定的函数。我加了几句代码,设定2秒钟超时时间,超时的话,显示超时。现在的问题是,超时后并没有结束域名的解析。超过2秒钟解析出的域名还会显示到listBox中。而超时后想调用Dns.EndResolve()结束解析的话会抛出异常。

有待研究。

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

namespace NetWork
{

 public class DnsResolver : System.Windows.Forms.Form
 {
  private System.Windows.Forms.Button btnResolve;
  private System.Windows.Forms.Button btnClear;
  private System.Windows.Forms.Button btnAbout;
  private System.Windows.Forms.ListBox lbResults;
  private System.Windows.Forms.TextBox txtHost;

  private System.ComponentModel.Container components = null;

  public DnsResolver()
  {
   InitializeComponent();
  }


  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.btnResolve = new System.Windows.Forms.Button();
   this.txtHost = new System.Windows.Forms.TextBox();
   this.lbResults = new System.Windows.Forms.ListBox();
   this.btnClear = new System.Windows.Forms.Button();
   this.btnAbout = new System.Windows.Forms.Button();
   this.SuspendLayout();
   //
   // btnResolve
   //
   this.btnResolve.Location = new System.Drawing.Point(24, 64);
   this.btnResolve.Name = "btnResolve";
   this.btnResolve.TabIndex = 0;
   this.btnResolve.Text = "&Resolve";
   this.btnResolve.Click += new System.EventHandler(this.btnResolve_Click);
   //
   // txtHost
   //
   this.txtHost.Location = new System.Drawing.Point(8, 24);
   this.txtHost.Name = "txtHost";
   this.txtHost.Size = new System.Drawing.Size(160, 21);
   this.txtHost.TabIndex = 1;
   this.txtHost.Text = "";
   //
   // lbResults
   //
   this.lbResults.ItemHeight = 12;
   this.lbResults.Location = new System.Drawing.Point(176, 8);
   this.lbResults.Name = "lbResults";
   this.lbResults.Size = new System.Drawing.Size(296, 232);
   this.lbResults.TabIndex = 2;
   //
   // btnClear
   //
   this.btnClear.Location = new System.Drawing.Point(24, 112);
   this.btnClear.Name = "btnClear";
   this.btnClear.TabIndex = 3;
   this.btnClear.Text = "&Clear";
   this.btnClear.Click += new System.EventHandler(this.btnClear_Click);
   //
   // btnAbout
   //
   this.btnAbout.Location = new System.Drawing.Point(24, 160);
   this.btnAbout.Name = "btnAbout";
   this.btnAbout.TabIndex = 4;
   this.btnAbout.Text = "&About...";
   this.btnAbout.Click += new System.EventHandler(this.btnAbout_Click);
   //
   // DnsResolver
   //
   this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
   this.ClientSize = new System.Drawing.Size(504, 253);
   this.Controls.AddRange(new System.Windows.Forms.Control[] {
                    this.btnAbout,
                    this.btnClear,
                    this.lbResults,
                    this.txtHost,
                    this.btnResolve});
   this.Name = "DnsResolver";
   this.Text = "Dns Resolver";
   this.ResumeLayout(false);

  }
  #endregion

  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main()
  {
   Application.Run(new DnsResolver());
  }

  void DnsResolved(IAsyncResult ar)
  {
   IPHostEntry entry=Dns.EndResolve(ar);
   
   foreach(IPAddress ip in entry.AddressList)
   {
    lbResults.Items.Add("address: "+ip.ToString());
   }

   foreach(string alias in entry.Aliases)
   {
    lbResults.Items.Add("alias: "+alias.ToString());
   }

   lbResults.Items.Add("resolve done.");
  }
   


  private void btnResolve_Click(object sender, System.EventArgs e)
  {
   if( txtHost.Text=="" ) return;

   lbResults.Items.Add("resolve beginning...");
   IAsyncResult ar=Dns.BeginResolve(txtHost.Text,new AsyncCallback(DnsResolved),null);
   if (!ar.AsyncWaitHandle.WaitOne(2000,false))
   {
    lbResults.Items.Add("two seconds elapsed, failed");
   }
  }

  private void btnClear_Click(object sender, System.EventArgs e)
  {
   lbResults.Items.Clear();
  }

  private void btnAbout_Click(object sender, System.EventArgs e)
  {
   string str="a tool to get the addresses & aliases of a host\n"
    +"by xuhx\n"
    +"email:[email protected]/[email protected]";
   MessageBox.Show(str,this.Text,MessageBoxButtons.OK,MessageBoxIcon.Information);
  }
 }
}

本文地址:http://com.8s8s.com/it/it44672.htm