C# 获得局域网主机列表实例

   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 WindowLanSearch
  
{
  
/// 
  
/// Form1 的摘要说明。
  
/// 

  public class Form1 : System.Windows.Forms.Form
  
{
  
private System.Windows.Forms.TextBox textBox1;
  
private System.Windows.Forms.Button button1;
  
private string[,] LanHost;
  
private System.Windows.Forms.ProgressBar progressBarSearch;
  
private Thread[] thread;
  
private System.Windows.Forms.ListView listView1;
  
private System.Windows.Forms.ColumnHeader columnHeader1;
  
private System.Windows.Forms.ColumnHeader columnHeader2;
  
private string str;
  
/// 
  
/// 必需的设计器变量。
  
/// 

  private System.ComponentModel.Container components = null;
  
  
public Form1() 
  
{
  
//
  
// Windows 窗体设计器支持所必需的
  
//
  InitializeComponent();
  InitLanHost();
  progressBarSearch.Maximum 
= 255;
  
  
//
  
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
  
//
  }

  
  
/// 
  
/// 数组初始化
  
/// 

  private void InitLanHost()
  
{
  LanHost 
= new string[255,2];
  
for (int i=0;i<255;i )
  
{
  LanHost[i,
0= "";
  LanHost[i,
1= "";
  }

  }

  
  
/// 
  
/// 清理所有正在使用的资源。
  
/// 

  protected override void Dispose( bool disposing )
  
{
  
if( disposing )
  
{
  
if (components != null)
  
{
  components.Dispose();
  }

  }

  
base.Dispose( disposing );
  }

  
  
Windows 窗体设计器生成的代码
  
  
/// 
  
/// 应用程序的主入口点。
  
/// 

  [STAThread]
  
static void Main()
  
{
  Application.Run(
new Form1());
  }

  
private void button1_Click(object sender, System.EventArgs e)
  
{
  
  LanSearch();
  
  }

  
/// 
  
/// 局域网搜索事件
  
/// 

  private void LanSearch()
  
{
  thread 
= new Thread[255];
  
  ThreadStart threadMethod;
  
  Thread threadProgress 
= new Thread(new ThreadStart(progressSearch));
  threadProgress.Start();
  
  
string localhost = (Dns.GetHostByName(Dns.GetHostName())).AddressList[0].ToString(); //本地主机IP地址 
  str = localhost.Substring(0,localhost.LastIndexOf("."));
  
  
for (int i=0;i<255;i ) //建立255个线程扫描IP
  {
  threadMethod 
= new ThreadStart(LanSearchThreadMethod);
  thread[i] 
= new Thread(threadMethod);
  thread[i].Name 
= i.ToString();
  thread[i].Start();
  
if (!thread[i].Join(100))  //Thread.Join(100)不知道这处这么用对不对,感觉没什么效果一样
  {
  thread[i].Abort();
  }

  }

  
  GetLanHost();
  listLanHost();
  }

  
/// 
  
/// 多线程搜索方法
  
/// 

  private void LanSearchThreadMethod()
  
{
  
int Currently_i = Convert.ToUInt16(Thread.CurrentThread.Name); //当前进程名称
  
  IPAddress ScanIP 
= IPAddress.Parse( str "." Convert.ToString(Currently_i 1)); //获得扫描IP地址
  IPHostEntry ScanHost = null;
  ScanHost 
= Dns.GetHostByAddress(ScanIP);  //获得扫描IP地址主机信息
  
  
if (ScanHost != null)
  
{
  LanHost[Currently_i,
0= ScanIP.ToString(); 
  LanHost[Currently_i,
1= ScanHost.HostName;
  }

  
  
//progressBarSearch.Value = progressBarSearch.Value 1;
  
  }

  
/// 
  
/// 文本框显示主机名与IP列表
  
/// 

  private void GetLanHost()
  
{
  
for (int i=0;i<255;i )
  
if ( LanHost[i,0!="")
  
{
  textBox1.Text 
=textBox1.Text LanHost[i,1":" LanHost[i,0"\r\n";
  }

  }

  
/// 
  
/// listview1 显示搜索主机
  
/// 

  private void listLanHost()
  
{
  listView1.View 
= View.List;
  
  ListViewItem aa ;
  
for (int i=0;i<255;i )
  
{
  
if ( LanHost[i,0!="")
  
{
  aa
= new ListViewItem();
  aa.Text 
= LanHost[i,1];
  aa.Tag 
= LanHost[i,0];
  listView1.Items.Add(aa);
  }

  }

  
  }

  
/// 
  
/// 进度条处理线程
  
/// 

  private void progressSearch()
  
{
  
//label1.Text = "进度条只是时间估计,不是真实搜索进度!"; 
  progressBarSearch.Value = 0;
  
for (int i=0;i<255;i )
  
{
  progressBarSearch.Value 
= progressBarSearch.Value 1;
  Thread.Sleep(
100);
  }

  }

  }

  }

  
  遗憾之处:因搜索较慢,没有实现真实的搜索进度。
  不懂之处:实现文字提示时,当在鼠标事件首尾插入
  
private void button1_Click(object sender, System.EventArgs e)
  
{
  lab1.Text 
= “开始搜索”;   //新插入
  LanSearch();
  lab1.Text 
= “结束搜索”;   //新插入
  }

  文本提示时,在lab1上始终不能及时显示,而是等所有线程结束后才显示“结束搜索“。



现在开始接触扫描远程计算机部分的代码。感觉c#在网络编程方面是简单而强大的,主要用namespace的System.Net和System.Net.Sockets,这两个namespace中包含丰富的类可以开发多种网络应用程序。

要使用这两个类,首先要加上对这两个类的引用:

using System.Net;
using System.Net.Sockets;

而通过IP获得计算机名则是用以下语句:

IPAddress myIP=IPAddress.Parse(sIP);//把IP字符串通过Parse转换为IP地址实例

     IPHostEntry myHost
=Dns.GetHostByAddress(myIP);//用GetHostByAddress方法根据IP获得主机名
     sHostName=myHost.HostName.ToString();//将计算机名传给我自己定放的字符串变量

通过以上简单语句就能根据IP获得远程主机的计算机名。

posted @ 2007-09-10 17:53  宿远  阅读(267)  评论(0)    收藏  举报