读书人

扫描局域网在线计算机(高分)解决方案

发布时间: 2012-02-19 19:43:39 作者: rapoo

扫描局域网在线计算机(高分)
我想用C#写一个扫描的局域网在线PC的程序,不知道怎么着手。有那位大哥给一个思路。

该程序只要能获得所有在线计算机的IP地址或者计算机名列表就行了(注意是 在线 ,去获得DNS我毫无意义)。

[解决办法]
http://hi.baidu.com/dovebo/blog/item/f2b93dd3144d07003af3cf89.html


[解决办法]
多线程ping IP不就可以了吗、具体写法看看MSND
[解决办法]
给你一个精品的

FOR /L %%i IN (1, 1, 110) DO ping -a -n 1 -w 10 192.168.11.%%i

192.168.11. 改成你的网段



[解决办法]
[DllImport( "Netapi32 ", CharSet=CharSet.Unicode)]
private static extern int NetServerEnum(
string servername,// must be null
int level,// 100 or 101
out IntPtr bufptr,// pointer to buffer receiving data
int prefmaxlen,// max length of returned data
out int entriesread,// num entries read
out int totalentries,// total servers + workstations
uint servertype,// server type filter
[MarshalAs(UnmanagedType.LPWStr)]
string domain,// domain to enumerate
IntPtr resume_handle );
可以获取局域网中所有计算机,SQL SERVER服务器,打印服务,时间服务等

[解决办法]
还有一法,就是用DOS命令:
cmd /c net view > 0.txt
这方法我以前也给CSDN上的朋友说过,现在忘了源码,只好重新帮你写,测试了
代码如下:
System.Diagnostics.ProcessStartInfo psi =
new System.Diagnostics.ProcessStartInfo();
psi.FileName = "cmd ";
psi.Arguments = "/c net view > 0.txt ";
psi.WindowStyle=System.Diagnostics.ProcessWindowStyle.Hidden;
Application.DoEvents();
System.Diagnostics.Process.Start(psi);
System.IO.StreamReader sr = null;
bool dosrun = true;
while(dosrun)
{
Application.DoEvents();
try
{
System.Threading.Thread.Sleep(1000);
sr = new System.IO.StreamReader(Application.StartupPath
+ "\\0.txt ");
dosrun =false;
}
catch
{
dosrun =true;
}
}
ArrayList ar=new ArrayList();
string str=sr.ReadLine();
while(str!=null)
{
Application.DoEvents();
if(str.StartsWith( "\\\\ "))
ar.Add(str.Substring(2));
str=sr.ReadLine();
}
lbComputers.DataSource=ar;

[解决办法]
private void button1_Click(object sender, System.EventArgs e)
{
IPHostEntry myHost = new IPHostEntry();
try
{
this.richTextBox1.Text = " ";
myHost = Dns.GetHostByName(Dns.GetHostName());
textBox1.Text = myHost.HostName.ToString();
for(int i=0; i <myHost.AddressList.Length;i++)
{
richTextBox1.AppendText( "本地主机IP地址-> " + myHost.AddressList[i].ToString()+ " ");
}
}
catch(Exception error)
{
MessageBox.Show(error.Message);
}

}
[解决办法]
C#实现网段扫描
摘要

想必大家对小榕时光等扫描器都非常熟悉了,有没有自己写一个的冲动。最近微软推实施了.NET战略方案,C#是主推语言,你们是否有兴趣用C#来实现对局域网IP地址的扫描,尝试一下自己写的快乐,那么请跟我来。


--------------------------------------------

目录

1.使用的类

2.获取本地主机IP地址

3.远程查询

4.实现网段的扫描


--------------------------------------------



正文

1.先介绍一下使用的类:

DNS类:在.net中的System.net命名空间下,主要的功能是从 Internet 域名系统 (DNS) 检索关于特定主机的信息。

IPHostEntry类:将一个域名系统 (DNS) 主机与一组别名和一组匹配的 IP 地址关联,和DNS类一起使用。

IPAddress 类:IP 网络上的地址。

使用的命名空间有:

System.Net 命名空间为当前网络上使用的多种协议提供了简单的编程接口.

System.IO命名空间包含允许在数据流和文件上进行同步和异步读取及写入的类型。

System.Thread 命名空间主要是用来多线程序编程。

程序实现以下几个功能:

2.获取本地主机IP地址

//对Button控件的事件的响应
private void buttion1_click(object sender,System.Event.Args e)
{
IPHostEntry myHost = new IPHostEntry();
Try
{
// Dns.GetHostName()获取本地计算机的主机名
// Dns.GetHostByName()获取指定 DNS 主机名的 DNS 信息
//得到本地主机的DNS信息
myHost = Dns.GetHostByName(Dns.GetHostName());
//显示本地主机名
textBox1.Text = myHost.HostName.ToString();
//显示本地主机的IP地址表
for(int i=0; i <myHost.AddressList.length;i++)
{
richTextBox1.AppendText(“本地主机IP地址-> ”+myHost.AddressList[i].ToString()+”\r”);
}
catch(Exception error)
{
MessageBox.Show(error.Message);
}
}//private

3.远程查询

private void buttion2_click(object Sender,System.EventArgs e)
{

IPHostEntry myDnsToIP = new IPHostEntry();
//Dns.Resolve 方法: 将 DNS 主机名或以点分隔的四部分表示法格式的 // IP 地址解析为 IPHostEntry实例
myDnsToIP =Dns.Resolve(textBox2.Text.ToString());
//显示此域名的IP地址的列表
for(int i=0;i <myDnsToIPAddressList.Length;i++)
{
rich.TextBox1.AppendText(textBox2.Text+”的IP地址是”+myDnsToIP.AddressList[i].ToString()+”\r”);
}
}

4.实现网段的扫描

实现网段的扫描,确定网络中正在使用的主机数目。这里使用了多线程技术,增加了一个线程,为了防止程序扫描的时间过长,影响程序的响应。不过在.net中由于使用了垃圾收集技术所以对线程的控制也不是很复杂的。

private void button3_click(object sender, System.EventArgs e)
{
//Thread 类: 创建并控制线程
Thread thScan = new thread(new ThreadStrart(ScanTarget));
//Thread.Start 方法:启动线程
thScan.Strart();
}
private void ScanTarget()
{
//构造IP地址的31-8BIT 位,也就是固定的IP地址的前段
// numericUpDown1是定义的System.Windows.Forms.NumericUpDown控件
string strIPAddress=numericUpDown1.Text+”.”+numericUpDown2.Text+”.”+numericUpDown3.Text+”.”;
//开始扫描地址
int nStrat = Int32.Parse(numericUpDown4.Text);
//终止扫描地址
int nEnd =Int32.Parse(numericUpDown5.Text);
//扫描的操作
for(int i=nStrat;i <=nEnd;i++)
{
string strScanIPAdd = strIPAddress +i.ToString();
//转换成IP地址
IPAddress myScanIP = IPAddress.Parse(strScanIPAdd);
try
{
//你可以加入自已的,增强功能
// Dns.GetHostByAddress 方法: 根据 IP 地
//址获取 DNS 主机信息。
IPHostEntry myScanHost =
Dns.GetHostByAddress(myScanIP);
//获取主机的名
string strHostName =myScanHost.HostName.ToString();
richTextBox1.AppendText(strScanIPAdd+”-> ”+strHostName+”\r”);
}
catch(Exception error)
{
MessageBox.Show(error.Message);
}
}//for
}//private

到此为止一个简单用C#实现扫描器的主要功能就完成了,试一下你可以看到你的网络上的主机,有没有成就感了:)

[解决办法]
这看你怎么定义“在线”。要能判断对方在线与否的,必须对方有一个端口是开着的,而那么多个端口你怎么知道用哪个来判断对方在线呢(往往只有少数几个是开着的,其它是隐藏的)?有若干常见办法:
1.端口扫描,每一个端口都去试,但如果对方有防火墙,通常试了几个就马上触发防扫描机制,把你的机block掉,你就会误判那台机不再线。
2.扫描常见端口,例如21、23、80……这对于开来提供服务的机器还有效,完全私人上网型可以不开任何一个这些常见服务端口。

读书人网 >C#

热点推荐