扫描局域网内电脑,并获得对应的MAC地址和主机名

本文介绍了一个C#程序,该程序用于在局域网内扫描活动设备并获取其MAC地址。通过创建多个线程,程序遍历192.168.1.1到192.168.1.255之间的IP地址,并使用SendARP函数从活跃设备获取MAC地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码如下:

 

using System;
using System.Net;
using System.Threading;

using System.Runtime.InteropServices;

ExpandedBlockStart.gifContractedBlock.gif
namespace LocalIP {
ExpandedSubBlockStart.gifContractedSubBlock.gif  
class LanSearch {

ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
    
/// 取MAC地址
    
/// </summary>
    
/// <param name="DestIP">目标IP</param>
    
/// <param name="SrcIP">源IP</param>
    
/// <param name="pMacAddr">MAC地址</param>
    
/// <param name="PhyAddrLen">MAC地址的长度</param>
    
/// <returns></returns>

    [DllImport("iphlpapi.dll", ExactSpelling = true)]
    
private static unsafe extern int SendARP(int DestIP, int SrcIP, [Out] byte[] pMacAddr, ref int PhyAddrLen);

ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
    
/// 在线程中扫描
    
/// </summary>

ExpandedSubBlockStart.gifContractedSubBlock.gif    private static void LanSearchThreadMethod() {
      
int i = Convert.ToUInt16(Thread.CurrentThread.Name);
      Console.Write(
".");

      
string strIP = "192.168.1." + i.ToString();

      
//IPHostEntry ip = null;
      IPAddress ip = null;
ExpandedSubBlockStart.gifContractedSubBlock.gif      
try {
        
//ip = Dns.GetHostEntry(strIP);
        ip = IPAddress.Parse(strIP);
      }

ExpandedSubBlockStart.gifContractedSubBlock.gif      
catch {
        
//Console.WriteLine("请勿输入非法IP地址");
        return;
      }


      
byte[] b = new byte[6];
      
int len = b.Length;
      
//int r = SendARP(BitConverter.ToInt32(ip.AddressList[0].GetAddressBytes(), 0), 0, b, ref len);
      int r = SendARP(BitConverter.ToInt32(ip.GetAddressBytes(), 0), 0, b, ref len);
      
int num = BitConverter.ToInt32(b, 0);
      
string mac = BitConverter.ToString(b, 06);

ExpandedSubBlockStart.gifContractedSubBlock.gif      
if (num != 0{//有效MAC
        
//Console.WriteLine("\r\n{0}--{1}--{2}", ip.AddressList[0].ToString(), ip.HostName, mac);
        Console.WriteLine("\r\n{0}--{1}", ip.ToString(), mac);
      }

    }


ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
    
/// 程序主入口
    
/// </summary>
    
/// <param name="args"></param>

    [STAThread]
ExpandedSubBlockStart.gifContractedSubBlock.gif    
static void Main(string[] args) {
      Thread[] thread 
= new Thread[255];
      ThreadStart threadMethod;

ExpandedSubBlockStart.gifContractedSubBlock.gif      
for (int i = 0; i < 255; i++{
        threadMethod 
= new ThreadStart(LanSearchThreadMethod);
        thread[i] 
= new Thread(threadMethod);
        thread[i].Name 
= i.ToString();
        thread[i].Start();
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (!thread[i].Join(100)) {
          thread[i].Abort();
        }

      }


      Console.WriteLine(
"\r\n按任意键返回");
      Console.ReadLine();
    }


  }

}

转载于:https://www.cnblogs.com/hawkjin/archive/2008/08/29/1279363.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值