C#实现网段扫描

 原作者姓名 落叶夏日
文章原始出处 黑客防线(12期)转载请和作者联系 原作者姓名 落叶夏日
  

      想必大家对小榕时光等扫描器都非常熟悉了,有没有自己写一个的冲动。最近微软推实施了.NET战略方案,C#是主推语言,你们是否有兴趣用C#来实现对局域网IP地址的扫描,尝试一下自己写的快乐,那么请跟我来。
先介绍一下使用的类:
1.    DNS类:在.net中的System.net命名空间下,主要的功能是从 Internet 域名系统 (DNS) 检索关于特定主机的信息。
2.    IPHostEntry类:将一个域名系统 (DNS) 主机与一组别名和一组匹配的 IP 地址关联,和DNS类一起使用。
3.    IPAddress 类:IP 网络上的地址。
使用的命名空间有:
     System.Net 命名空间为当前网络上使用的多种协议提供了简单的编程接口.
     System.IO命名空间包含允许在数据流和文件上进行同步和异步读取及写入的类型。
     System.Thread 命名空间主要是用来多线程序编程。
    程序实现以下几个功能:
1.    获取本地主机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
2.    远程查询
  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”);
}
}
3.    实现网段的扫描,确定网络中正在使用的主机数目。这里使用了多线程技术,增加了一个线程,为了防止程序扫描的时间过长,影响程序的响应。不过在.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#实现扫描器的主要功能就完成了,试一下你可以看到你的网络上的主机,有没有成就感了:),如果有疑问请到 www.vchelp.net论坛的C#或是.NET版面和我讨论,或发信给我 chenweijun_sh@etang.com,当然你也可以和黑防联系。
                                                  落叶夏日  
                                                           2002-07-29

  • 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、付费专栏及课程。

余额充值