当前位置:首页 > 行业动态 > 正文

c# 扫描网络主机

简答,使用C#扫描网络主机可通过Ping类实现,遍历IP地址段并发送ICMP回显请求检测在线状态。

在C#中,扫描网络主机通常涉及到获取局域网内所有活动设备的IP地址和相关信息,以下是实现这一功能的方法:

使用Ping类

原理

Ping类允许应用程序发送ICMP回显消息(ping操作)到远程计算机,并等待响应,通过向特定IP地址发送ping请求,可以判断该IP地址对应的设备是否在线。

示例代码

using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Collections.Generic;
class NetworkScanner
{
    static void Main()
    {
        string subnet = "192.168.1"; // 子网地址
        int timeout = 100; // 超时时间(毫秒)
        List<IPAddress> activeHosts = new List<IPAddress>();
        for (int i = 1; i <= 254; i++)
        {
            string host = subnet + "." + i;
            bool pingable = false;
            Ping pingSender = new Ping();
            try
            {
                PingReply reply = pingSender.SendPingAsync(host, timeout).GetAwaiter().GetResult();
                if (reply.Status == IPStatus.Success)
                {
                    pingable = true;
                }
            }
            catch (PingException)
            {
                // 忽略异常,继续扫描下一个地址
            }
            if (pingable)
            {
                activeHosts.Add(IPAddress.Parse(host));
                Console.WriteLine("Active host found: " + host);
            }
        }
        Console.WriteLine("Scan complete. Active hosts:");
        foreach (var address in activeHosts)
        {
            Console.WriteLine(address);
        }
    }
}

解释

子网设置:将subnet变量设置为要扫描的子网地址,例如"192.168.1"

循环扫描:使用for循环从1到254遍历子网内的所有可能IP地址。

Ping操作:对每个IP地址执行ping操作,检查设备是否在线,如果设备响应ping请求,则将其添加到activeHosts列表中。

结果输出:扫描完成后,输出所有找到的活动主机。

使用第三方库SharpPcap

原理

SharpPcap是一个用于捕获网络数据包的开源库,它允许应用程序监听网络接口上的数据包,从而检测网络上的设备。

安装和配置

需要安装SharpPcap库,可以使用NuGet包管理器安装:

Install-Package SharpPcap

示例代码

using System;
using SharpPcap;
using SharpPcap.LibPcap;
using System.Collections.Generic;
class NetworkScanner
{
    static void Main()
    {
        string device = GetDefaultDevice(); // 获取默认网络设备
        ICaptureDevice captureDevice = CaptureDeviceList.Instance[device]; // 获取捕获设备实例
        captureDevice.OnPacketArrival += new PacketArrivalEventHandler(Device_OnPacketArrival);
        captureDevice.Start(); // 开始捕获数据包
        Console.WriteLine("Press Enter to stop scanning...");
        Console.ReadLine();
        captureDevice.Stop(); // 停止捕获数据包
    }
    private static string GetDefaultDevice()
    {
        return CaptureDeviceList.Instance[0].Name; // 返回默认设备名称
    }
    private static void Device_OnPacketArrival(object sender, CaptureEventArgs e)
    {
        // 在这里处理捕获到的数据包,提取源MAC地址等信息
        // 注意:这只是一个简化的示例,实际实现可能需要更复杂的逻辑来解析数据包并识别设备
        Console.WriteLine("Packet captured from: " + BitConverter.ToString(e.Packet.LinkLayerTypeData));
    }
}

解释

设备选择:选择默认的网络设备进行数据包捕获。

事件处理:为捕获设备注册PacketArrival事件处理程序,以便在捕获到数据包时执行自定义逻辑。

数据包处理:在Device_OnPacketArrival方法中处理捕获到的数据包,在这个示例中,简单地打印出数据包的链路层类型数据,但实际应用中可能需要更复杂的逻辑来解析数据包并识别网络上的设备。

启动和停止捕获:启动捕获设备开始捕获数据包,并在用户按下Enter键后停止捕获。

需要注意的是,使用SharpPcap进行网络扫描可能会受到防火墙、网络拓扑和其他因素的影响,因此在某些情况下可能无法准确检测到所有设备,由于SharpPcap主要用于捕获数据包而不是直接扫描网络设备,因此这种方法可能不如使用Ping类那样直观和简单。