C# 实现网段扫描

摘要  



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



正文  



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



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



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



IPAddress  类:IP  网络上的地址。  



使用的命名空间有:  



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



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



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



程序实现以下几个功能:  



2.获取本地主机IP地址  



///  <summary>  

///  按扭查询本机ip  

///  </summary>  

///  <param  name=/sender/></param>  

///  <param  name=/e/></param>  

private  void  button1_Click(object  sender,  System.EventArgs  e)  

{  

IPHostEntry  myHost  =  new  IPHostEntry();  

try  

{  

this.richTextBox1.Text  =  //;  

//  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);  

}  



}  



3.远程查询  



private  void  button2_Click(object  sender,  System.EventArgs  e)  

{  

this.richTextBox1.Text  =  //;  

IPHostEntry  myDnsToIP  =  new  IPHostEntry();  

//Dns.Resolve  方法:  将  DNS  主机名或以点分隔的四部分表示法格式的  

//  IP  地址解析为  IPHostEntry实例  

myDnsToIP  =Dns.Resolve(textBox2.Text.ToString());  

//显示此域名的IP地址的列表  

for(int  i=0;i<myDnsToIP.AddressList.Length;i++)  

{  

richTextBox1.AppendText(textBox2.Text  +  /的IP地址是/  +  myDnsToIP.AddressList[i].ToString()  +  //r/);  

}  



}  



4.实现网段的扫描  



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



private  void  button3_Click(object  sender,  System.EventArgs  e)  

{  

this.richTextBox1.Text  =  //;  

//Thread  类:  创建并控制线程  

//Thread  thScan  =  new  Thread(new  ThreadStart(ScanTarget));  

Thread  thScan  =  new  Thread(new  ThreadStart(ScanTarget));  

//Thread.Start  方法:启动线程  

thScan.Start();  

}  



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);  

}  

}  

}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,可以使用Socket类实现网段扫描IP设备。具体步骤如下: 1. 构造一个Socket对象,并指定其类型为SocketType.Dgram; 2. 构造一个IPEndPoint对象,指定目标IP和端口号; 3. 将IPEndPoint对象绑定到Socket对象上; 4. 构造一个byte数组,用于发送数据包; 5. 使用Socket对象的SendTo方法发送数据包到目标IP; 6. 使用Socket对象的ReceiveFrom方法接收响应数据包; 7. 分析响应数据包,确定是否有设备响应。 下面是一个简单的跨网段扫描IP设备的示例代码: ```csharp using System; using System.Net; using System.Net.Sockets; namespace ScanIPDevices { class Program { static void Main(string[] args) { // 构造一个Socket对象 Socket socket = new Socket(SocketType.Dgram, ProtocolType.Udp); // 构造一个IPEndPoint对象,指定目标IP和端口号 IPEndPoint targetEP = new IPEndPoint(IPAddress.Parse("192.168.0.255"), 8080); // 将IPEndPoint对象绑定到Socket对象上 socket.Bind(new IPEndPoint(IPAddress.Any, 0)); // 构造一个byte数组,用于发送数据包 byte[] data = new byte[1]; data[0] = 0x00; // 使用Socket对象的SendTo方法发送数据包到目标IP socket.SendTo(data, targetEP); // 接收响应数据包 EndPoint responseEP = new IPEndPoint(IPAddress.Any, 0); byte[] buffer = new byte[1024]; int receivedBytes = socket.ReceiveFrom(buffer, ref responseEP); // 分析响应数据包,确定是否有设备响应 if (receivedBytes > 0) { Console.WriteLine($"Device {responseEP.ToString()} is online!"); } else { Console.WriteLine("No device is online!"); } // 关闭Socket对象 socket.Close(); Console.ReadKey(); } } } ``` 在上面的示例代码中,我们通过向目标IP发送一个空的数据包,然后等待设备的响应,从而确定是否有设备在线。 需要注意的是,如果要扫描整个局域网,可以将目标IP设置为广播地址,如本例中的"192.168.0.255",这样可以遍历整个局域网,但可能会导致网络拥堵。因此,在实际应用中,需要根据具体需求调整扫描范围。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值