使用C#构建局域网网段扫描工具:原理与代码实现

宋时安
宋时安
发布时间:2026-10-13| 4人浏览过
原创

如何利用C#和.NET框架开发局域网IP扫描工具?本文详解基于System.Net的DNS解析机制获取主机IP,以及运用Thread类实现多线程网段遍历,从而高效探测局域网内活跃的主机地址与域名映射关系。

核心原理与前置准备

实现网段扫描主要依赖网络通信协议中的域名系统(DNS)查询功能。在.NET环境中,核心类库位于 System.Net 命名空间,该空间提供了对互联网协议的简单编程接口。我们将重点使用以下三个类:

  • Dns 类:用于从Internet DNS检索特定主机的信息,如主机名或IP地址。
  • IPHostEntry 类:将DNS主机名关联到一组别名和匹配的IP地址列表。
  • IPAddress 类:表示网络上的IP地址对象。

为了提升扫描效率,避免UI界面阻塞,代码中引入了 System.Threading 命名空间进行多线程编程。同时,System.IO 命名空间可用于处理数据的同步或异步读写(本例中主要通过UI控件展示结果)。

第1步:获取本地主机IP地址

首先需要确认本机在网络中的身份。通过调用 Dns.GetHostName() 获取当前计算机的主机名,再结合 Dns.GetHostByName() 解析其IP信息。

private void button1_Click(object sender, System.EventArgs e)
{
    IPHostEntry myHost = new IPHostEntry();
    try
    {
        this.richTextBox1.Text = "";
        // 获取本地计算机的主机名
        // 获取指定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);
    }
}

第2步:远程域名/IP反向查询

支持用户输入域名或IP地址,程序将其解析为对应的IP列表。这利用了 Dns.Resolve 方法,它可以将DNS主机名或以点分隔的四部分IP地址解析为 IPHostEntry 实例。

private void button2_Click(object sender, System.EventArgs e)
{
    this.richTextBox1.Text = "";
    IPHostEntry myDnsToIP = new IPHostEntry();
    
    // 解析用户输入的文本框内容
    myDnsToIP = Dns.Resolve(textBox2.Text.ToString());
    
    // 显示此域名/IP对应的所有IP地址列表
    for (int i = 0; i < myDnsToIP.AddressList.Length; i++)
    {
        richTextBox1.AppendText(textBox2.Text + "的IP地址是" + myDnsToIP.AddressList[i].ToString() + "\r");
    }
}

第3步:多线程实现网段批量扫描

这是扫描器的核心功能。由于逐个Ping或解析IP耗时较长,若在主线程执行会导致界面假死。因此,创建一个新线程专门负责扫描任务。

参数配置说明:

  • 前三个 NumericUpDown 控件共同构成基础网段(例如 192.168.1.)。
  • 第四、五个 NumericUpDown 控件分别设定起始IP后缀(nStrat)和终止IP后缀(nEnd)。
// 启动扫描按钮事件
private void button3_Click(object sender, System.EventArgs e)
{
    this.richTextBox1.Text = "";
    // 创建并控制新线程
    Thread thScan = new Thread(new ThreadStart(ScanTarget));
    // 启动线程
    thScan.Start();
}

// 实际的扫描逻辑运行在新线程中
private void ScanTarget()
{
    // 构造固定网段前缀,例如从控件获取 '192.168.1.'
    string strIPAddress = numericUpDown1.Text + "." + numericUpDown2.Text + "." + numericUpDown3.Text + ".";
    
    // 解析起始扫描IP的后缀
    int nStrat = Int32.Parse(numericUpDown4.Text);
    // 解析终止扫描IP的后缀
    int nEnd = Int32.Parse(numericUpDown5.Text);
    
    // 循环遍历指定范围内的IP
    for (int i = nStrat; i <= nEnd; i++)
    {
        string strScanIPAdd = strIPAddress + i.ToString();
        
        // 将字符串转换为IP地址对象
        IPAddress myScanIP = IPAddress.Parse(strScanIPAdd);
        
        try
        {
            // 根据IP地址获取DNS主机信息
            // 如果该IP对应的设备在线且可解析,则返回成功
            IPHostEntry myScanHost = Dns.GetHostByAddress(myScanIP);
            
            // 获取主机名(注意:某些防火墙或设备可能阻止DNS反向解析,导致超时或异常)
            string strHostName = myScanHost.HostName.ToString();
            
            // 输出结果:IP -> 主机名
            richTextBox1.AppendText(strScanIPAdd + "->" + strHostName + "\r");
        }
        catch (Exception error)
        {
            // 忽略无法解析或离线的主机,不中断整个扫描流程
            // 生产环境中建议在此处记录日志而非弹窗
            // MessageBox.Show(error.Message); 
        }
    }
}

注意事项与维护

关于性能优化:
上述代码采用了简单的线程方式。在实际应用中,如果需要扫描更广泛的网段,建议使用 Parallel.For 或 Task 等现代异步并发模型,并增加请求间隔,以避免对目标网络造成拥塞或被安全软件拦截。

关于异常处理:
在 ScanTarget 方法中,捕获异常是关键步骤。因为并非网段内的所有IP都是活跃的,或者即使活跃也可能未注册PTR记录。原代码中的 MessageBox.Show 在后台线程中弹出消息框可能会导致UI交互问题,建议在实际开发中改为静默处理或写入日志文件。

以上就是C#中实现网段扫描工具的详细内容,更多关于C#网络编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。