private   void   button1_Click(object   sender,   System.EventArgs   e)   
  {   
  this.button1.Enabled=false;   
  string   mystartIP="192.168.0.";   
  string   myip;   
  int   s,end;   
  string   name,mymac;   
    
  for(s=1;s<=255;s++)   
  {   
  myip=mystartIP   +s.ToString();   
    
  //转换IP地址   
  IPAddress   myscanip=IPAddress.Parse(myip);   
  try   
  {   
  System.Windows.Forms.Application.DoEvents();   
    
  IPHostEntry   myscanhost=Dns.GetHostByAddress(myscanip);   
    
              name=myscanhost.HostName.ToString();   
  this.listBox1.Items.Add(myip   +"             "   +name);   
    
    
    
  }   
  catch(Exception   myerror)   
  {   
    
  }   
    
  }   
    
    
  }   这样写程度太慢了~  还有就是如果我指定一个IP断:比如:192。168。1。113--192。168。1。116   114   115 是在线的` 但我一个也找不到,说什么机器积极什么来着  就获取不到了`  请教DX  我要怎么写才能获取当前局域网内在线的机器IP和 MAC地址呢

解决方案 »

  1.   

    获取当前局域网内IP简单,但是MAC地址还真不知道怎么获取
      

  2.   

    多线程处理就OK了呗?
    另外这个文章不知道你能用到不:
    http://hi.baidu.com/dangzhang/blog/item/846c36faff57a518a9d3115f.html
    这个是在web下获取客户端及服务器端所有信息的。PS:
    你可以多看看msdn里的net命名空间。
      

  3.   

    还有一个更恶毒的办法:
    模仿arp攻击。。
    我没做过,提供一种思路
    首先虚拟广播报文,把自己的ip和mac设置为 网关。发送此广播报文,这样局域网内所有的流量都会蜂拥而至到你的机器上,你再分析报文,取出IP\MAC。
    这个肯定要用多线程。
    建立一种合理的数据结构用来存储报文,再建立一种数据结构存储IP和MAC。
    循环开始根据tcp\ip报文的结构,检索报文,得到IP/MAC的地址。
    如果ip/mac地址不在存放IP/MAC地址的数据结构中(遍历该数据结构),
    则把地址存入数据结构。
    循环结束。
    显示IP/MAC列表。此种方法对于使用防止ARP攻击工具(如360和anti-arp)的机器不适应,因为当该机器收到广播报文的时候,会提示有arp攻击产生。PS:期待高人的解决方案。
      

  4.   

    刚刚在网上看到一段dos批处理程序:::code by [email protected] 2008-1-7 
    @echo off &setlocal enabledelayedexpansion 
    title 局域网空闲IP查询@bbs.bathome.cn 
    Rem '/*========获取本机的IP地址(局域网)=========*/ 
    echo 正在获取本机的IP地址,请稍等... 
    for /f "tokens=3 skip=2 delims=: " %%i in ('nbtstat -n') do ( 
    set "IP_addr=%%i" 
    set IP_addr=!IP_addr:~1,-1! 
    echo 本机IP为:!IP_addr! 
    goto :next 
    ) :next 
    for /f "delims=. tokens=1,2,3,4" %%i in ("%IP_addr%") do set IP_fd=%%i.%%j.%%k 
    Rem '/*========获取计算机名============*/ 
    echo.&echo 正在获取局域网内计算机名,请稍等... 
    echo 处于网段 %IP_fd%.* 的计算机有:&echo. 
    for /f "delims=" %%i in ('net view') do ( 
    set "var=%%i" 
    rem ----------获取计算机名称------------ 
    if "!var:~0,2!"=="\\" ( 
    set "var=!var:~2!" 
    echo !var! 
    Rem ----------ping计算机名-------------- 
    ping -n 1 !var!>nul 


    echo.&echo ----------------------------- 
    Rem '/*========提取arp缓存=========*/ 
    echo.&echo 正在获取局域网内计算机IP,请稍等...& echo. 
    for /f "skip=3 tokens=1,* delims= " %%i in ('arp -a') do echo IP: %%i 已经使用 echo.&echo ----------------------------- 
    echo 程序完成,谢谢使用! 
    pause>nul
      

  5.   

    还有一个比较土的办法:
    利用网关所维护的IP\MAC表。
    步骤:
    1.PING目标机器
    2.读取本机arp缓存(用arp -a就可以看到IP和MAC的对应了)。
      

  6.   

    获取MAC地址的方法,传入要获取的IP地址即可
    public string GetMac(string IP)
            {
                string dirResults = "";
                ProcessStartInfo psi = new ProcessStartInfo();
                Process proc = new Process();
                psi.FileName = "nbtstat";
                psi.RedirectStandardInput = false;
                psi.RedirectStandardOutput = true;
                psi.Arguments = "-A   " + IP;
                psi.UseShellExecute = false;
                proc = Process.Start(psi);
                dirResults = proc.StandardOutput.ReadToEnd();
                proc.WaitForExit();
                dirResults = dirResults.Replace("\r", "").Replace("\n", "").Replace("\t", "");
                Regex reg = new Regex("Mac[   ]{0,}Address[   ]{0,}=[   ]{0,}(?<key>((.)*?))__MAC", RegexOptions.IgnoreCase | RegexOptions.Compiled);
                Match mc = reg.Match(dirResults + "__MAC");            if (mc.Success)
                { return mc.Groups["key"].Value; }
                else
                {
                    reg = new Regex("Host   not   found", RegexOptions.IgnoreCase | RegexOptions.Compiled);
                    mc = reg.Match(dirResults);
                    if (mc.Success)
                    {
                        return "Host   not   found!";
                    }
                    else
                    { return ""; }
                }
            }
      

  7.   

    针对此方法:

    还有一个比较土的办法: 
    利用网关所维护的IP\MAC表。 
    步骤: 
    1.PING目标机器 
    2.读取本机arp缓存(用arp -a就可以看到IP和MAC的对应了)。

    我写了个例程:using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Diagnostics;
    using System.ComponentModel;
    using System.Threading;
    namespace IpMacScan
    {
        class Program
        {
            static void Main(string[] args)
            {
                for(int i=1;i<255;i++)
                {
                    Process.Start("ping"," 192.168.1."+i.ToString());
                    Thread.Sleep(100);
                }            Process.Start("arp"," -a >c:\\ip.txt");
            }
        }
    }
      

  8.   

    c:\IP.TXT的内容:
    Interface: 192.168.1.45 --- 0x3
      Internet Address      Physical Address      Type
      192.168.1.10          00-1e-90-29-0e-af     dynamic   
      192.168.1.88          00-e0-4c-75-5d-96     dynamic   
      192.168.1.193         00-0d-88-f5-65-00     dynamic   
      192.168.1.200         00-14-22-b8-36-20     dynamic   
      192.168.1.208         00-01-fb-00-82-b0     dynamic   
      192.168.1.213         00-1c-23-0a-38-08     dynamic   
      192.168.1.214         00-1c-23-31-70-be     dynamic   
      192.168.1.217         00-17-31-81-c1-77     dynamic   
      192.168.1.219         00-1d-0f-0e-c9-73     dynamic   
      192.168.1.223         00-1d-7d-94-4e-49     dynamic   
      192.168.1.226         00-16-d3-47-32-6e     dynamic   
      192.168.1.227         08-10-74-13-4f-c5     dynamic   
      192.168.1.229         00-1d-7d-94-4e-2c     dynamic   
      192.168.1.239         00-1e-e5-5a-0f-3a     dynamic   
      192.168.1.247         00-1a-4b-5e-12-ba     dynamic   
      192.168.1.250         00-14-78-97-c7-9a     dynamic   
      192.168.1.253         00-19-e0-f7-09-01     dynamic   
      

  9.   

    c:\IP.TXT的内容:
    Interface: 192.168.1.45 --- 0x3
      Internet Address      Physical Address      Type
      192.168.1.10          00-1e-90-29-0e-af     dynamic   
      192.168.1.88          00-e0-4c-75-5d-96     dynamic   
      192.168.1.193         00-0d-88-f5-65-00     dynamic   
      192.168.1.200         00-14-22-b8-36-20     dynamic   
      192.168.1.208         00-01-fb-00-82-b0     dynamic   
      192.168.1.213         00-1c-23-0a-38-08     dynamic   
      192.168.1.214         00-1c-23-31-70-be     dynamic   
      192.168.1.217         00-17-31-81-c1-77     dynamic   
      192.168.1.219         00-1d-0f-0e-c9-73     dynamic   
      192.168.1.223         00-1d-7d-94-4e-49     dynamic   
      192.168.1.226         00-16-d3-47-32-6e     dynamic   
      192.168.1.227         08-10-74-13-4f-c5     dynamic   
      192.168.1.229         00-1d-7d-94-4e-2c     dynamic   
      192.168.1.239         00-1e-e5-5a-0f-3a     dynamic   
      192.168.1.247         00-1a-4b-5e-12-ba     dynamic   
      192.168.1.250         00-14-78-97-c7-9a     dynamic   
      192.168.1.253         00-19-e0-f7-09-01     dynamic   
      

  10.   

    c:\IP.TXT的内容:
    Interface: 192.168.1.45 --- 0x3
      Internet Address      Physical Address      Type
      192.168.1.10          00-1e-90-29-0e-af     dynamic   
      192.168.1.88          00-e0-4c-75-5d-96     dynamic   
      192.168.1.193         00-0d-88-f5-65-00     dynamic   
      192.168.1.200         00-14-22-b8-36-20     dynamic   
      192.168.1.208         00-01-fb-00-82-b0     dynamic   
      192.168.1.213         00-1c-23-0a-38-08     dynamic   
      192.168.1.214         00-1c-23-31-70-be     dynamic   
      192.168.1.217         00-17-31-81-c1-77     dynamic   
      192.168.1.219         00-1d-0f-0e-c9-73     dynamic   
      192.168.1.223         00-1d-7d-94-4e-49     dynamic   
      192.168.1.226         00-16-d3-47-32-6e     dynamic   
      192.168.1.227         08-10-74-13-4f-c5     dynamic   
      192.168.1.229         00-1d-7d-94-4e-2c     dynamic   
      192.168.1.239         00-1e-e5-5a-0f-3a     dynamic   
      192.168.1.247         00-1a-4b-5e-12-ba     dynamic   
      192.168.1.250         00-14-78-97-c7-9a     dynamic   
      192.168.1.253         00-19-e0-f7-09-01     dynamic   
      

  11.   

    谢谢楼上`~ 可以获得MAC 地址   只是现在的问题是想在局域网内`我不知道有哪个IP  比如说我ping  192.168.1.234  没有这个IP   就不行啊   我是想在点击获取信息按钮的时候会把这个局域网内在线的机器放到的一个listbox里面`  其中包括IP  和MAC地址 这两列`~  是这样的效果~  也就是说我不会知道这个局域网内有哪些机器,不用知道某个机器的IP  
      

  12.   

    我用vb做的sniffer程序中有这个功能,不妨参考一下
    http://blog.csdn.net/wzuomin/archive/2007/06/14/1652558.aspx
      

  13.   

    c# 获取子网掩码和网关代码http://www.ithaiyang.cn/html/DOTNET/CSharp/5983.html 
     
    希望对你有帮助
      

  14.   

    如果目标机器不在线的话,网关(路由器)的路由表里面就不会存在该机器的mac-ip信息(除非事前绑定好了的,设定了静态路由的。如果是这种情况,你可以判断ping的结果。如果你考虑防火墙会禁止ping的话,那我就没折了,期待高人穿透防火墙的方法。)
    那个ping目标机器,然后读取arp缓存的办法我觉得还是比较简单的。
      

  15.   


    我说的是局玉网里面当前开机的机器`不开机的不取他的IP 和MAC地址`是这样的
      

  16.   

    我看到有一个软件叫局域网查看器`有这个功能~ 就是在运行的时候会把当前局域网内在线机器的IP和 MAC地址显示出来` 不在线的不显示~  请问有人有思路说下吗?  谢谢了`十分感激
      

  17.   

    /// <summary>
    /// 获取远程计算机的MAC地址(不管目标IP机器是否在线,都能很快的返回结果)
    /// </summary>
    /// <param name="ipRemote">远程机器的IP</param>
    /// <param name="ipLocal">本机的IP</param>
    /// <returns>如果返回值为无效长度或为"00:00:00:00:00:00",则表示目标IP的机器没有开机或开启了防火墙类软件,否则返回目标IP机器的MAC地址</returns>
    static public string onGetRemoteMAC(string ipRemote,string ipLocal)
    {
    Int32  ldest=  inet_addr(ipRemote);//目的地的ip
    Int32  lhost=  inet_addr(ipLocal);//本地的ip
    Int64  mac=0;
    Int64  len=6;
    string macString="";
    try
    {
    //使用SendARP取得MAC地址
    int  ii=SendARP(ldest,lhost,  ref  mac,  ref  len);
    //把得到的值转成十六进制
    string macTmp=mac.ToString("X12");
    string[] macArray=new string[6];

    for (int i=0;i<6;i++)
    macArray[i]=macTmp.Substring(2*i,2); for (int i=5;i>=0;i--)
    {
    macString=macString+macArray[i];
    if (i>0)
    macString=macString+":";
    }
    }
    catch(Exception  exc)
    {
    Yj_CommonVar.onShowMessagebox(exc);

    return macString;
    }/// <summary>
    /// 根据IP地址获取主机名(注意:如果指定的hostName不在线则可能需要花费较长时间才能返回)
    /// </summary>
    /// <param name="removeIP"></param>
    /// <returns></returns>
    static public string onGetHostNameByIP(string removeIP)
    {
    string hostNameStr="";
    try
    {
    IPAddress ip=IPAddress.Parse(removeIP);
    IPHostEntry hostName=Dns.GetHostByAddress(ip);
    hostNameStr=hostName.HostName;
    }
    catch
    {
    hostNameStr="";
    }
    return hostNameStr;
    }private ArrayList ipArr=new ArrayList();
    private void onStartScan()
    {
    this.bScan.Enabled=false;
    string localIP=Yj_CommonVar.CurrInIP;
    string ipStartStr=teStartIP.Text.Split('.')[0]+"."+teStartIP.Text.Split('.')[1]+"."+teStartIP.Text.Split('.')[2]+".";
    int startIp=Convert.ToInt32(teStartIP.Text.Split('.')[3]);
    int endIp=Convert.ToInt32(teEndIP.Text.Split('.')[3]);
    for(int i=startIp;i<=endIp;i++)
    {
    string ipStr=ipStartStr+i.ToString();
    if (ipArr.Contains(ipStr))
    {
    ipArr.Remove(ipStr);
    DataRow drN=ds.Tables[0].NewRow();
    DateTime startDT=DateTime.Now;
    string removeMac=Yj_NetTools.onGetRemoteMAC(ipStr,localIP);
    drN["IP"]=ipStr;
    if (removeMac.Length>0 && removeMac!="00:00:00:00:00:00")
    {
    string hostName=Yj_NetTools.onGetHostNameByIP(ipStr);
    drN["HOSTNAME"]=hostName;
    drN["ISONLINE"]=true;
    drN["MAC"]=removeMac;
    }
    else
    drN["ISONLINE"]=false;
    TimeSpan ts=DateTime.Now-startDT;
    drN["USETIME"]=(ts.Milliseconds<10?"<10":ts.Milliseconds.ToString());
    ds.Tables[0].Rows.Add(drN);
    Yj_CommonVar.onSendMessageUpdateMainStatusPro(ipArr.Count);
    }
    }
    this.bScan.Enabled=true;
    }
    private void bScan_Click(object sender, System.EventArgs e)
    {
    #region 构建数据表
    DataTable dt=new DataTable("IPList");
    dt=Yj_CommonVar.onAddIdAndRowNoColumns(dt);
    dt.Columns.Add("ISONLINE",typeof(bool));
    dt.Columns.Add("IP",typeof(string));
    dt.Columns.Add("HOSTNAME",typeof(string));
    dt.Columns.Add("MAC",typeof(string));
    dt.Columns.Add("USETIME",typeof(string));
    DataColumn[] priKeys=new DataColumn[1];
    priKeys[0]=dt.Columns["IP"];
    dt.PrimaryKey=priKeys;
    this.onInitGridViewData(dt);
    #endregion string ipStartStr=teStartIP.Text.Split('.')[0]+"."+teStartIP.Text.Split('.')[1]+"."+teStartIP.Text.Split('.')[2]+".";
    int startIp=Convert.ToInt32(teStartIP.Text.Split('.')[3]);
    int endIp=Convert.ToInt32(teEndIP.Text.Split('.')[3]);
    for(int i=startIp;i<=endIp;i++)
    ipArr.Add(ipStartStr+i.ToString());
    int j=0;
    Yj_CommonVar.onSendMessageUpdateMainStatusPro(endIp-startIp,endIp-startIp);
    while (j<Convert.ToInt32(seThreadNum.Text))
    {
    Thread  _Scan_=new Thread(new ThreadStart(onStartScan));
    _Scan_.Start();
    j++;
    }
    }
      

  18.   

    C#怎么获取当前局域网内在线机器的IP 和 MAC地址啊 在线等
    什么叫在线机器啊,不明白!哈哈
     
      

  19.   

    搜索局域网内机算机(机器名、IP。MAC地址)      
     using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Net;
    using System.Net.Sockets;
    using System.DirectoryServices;namespace ipcheck
    ...{
             //private System.ComponentModel.Container components = null;
        public partial class MainForm : Form
        ...{
            public MainForm()
            ...{
                InitializeComponent();
            }
            [DllImport("Iphlpapi.dll")]
            private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);
            [DllImport("Ws2_32.dll")]
            private static extern Int32 inet_addr(string ip);
            private string     macAddress,ipAddress;        private bool canPing = false;
            private string  GetMacAddress() // 得到指定IP的MAC地址 
            ...{
                Int32 ldest = 0;
                try
                ...{
                    ldest = inet_addr(ipAddress);
                }
                catch (Exception iperr)
                ...{
                    MessageBox.Show(iperr.Message);
                }
                Int64 macinfo = new Int64();
                Int32 len = 6;
                try
                ...{
                    int res = SendARP(ldest, 0, ref macinfo, ref len);
                }
                catch (Exception err)
                ...{
                    //    throw new Exception("在解析MAC地址过程发生了错误!"); 
                    MessageBox.Show(err.Message);
                }
                string originalMACAddress = macinfo.ToString("X4");
                if (originalMACAddress != "0000" && originalMACAddress.Length == 12)
                ...{ //合法MAC地址 
                    string mac1, mac2, mac3, mac4, mac5, mac6;
                    mac1 = originalMACAddress.Substring(10, 2);
                    mac2 = originalMACAddress.Substring(8, 2);
                    mac3 = originalMACAddress.Substring(6, 2);
                    mac4 = originalMACAddress.Substring(4, 2);
                    mac5 = originalMACAddress.Substring(2, 2);
                    mac6 = originalMACAddress.Substring(0, 2);
                    macAddress = mac1 + "-" + mac2 + "-" + mac3 + "-" + mac4 + "-" + mac5 + "-" + mac6;
                    canPing = true;
                }
                else
                ...{
                    macAddress = "无法探测到MAC地址";
                    canPing = false;
                }
                return macAddress;
            }
            private void tbar_ButtonClick(object sender, ToolBarButtonClickEventArgs e)
            ...{
                switch (e.Button.Name)
                ...{ 
                    case "Btn_search":
                        int i = 0;
                        DirectoryEntry root = new DirectoryEntry("WinNT:");
                        DirectoryEntries domains = root.Children;
                        domains.SchemaFilter.Add("domain");
                             foreach (DirectoryEntry  domain in domains)
                             ...{
                                 this.g_list.Items.Add(domain.Name.ToString());
                                 
                                 DirectoryEntries computers = domain.Children;
                                 computers.SchemaFilter.Add("computer");
                                    foreach (DirectoryEntry computer in computers)
                                 ...{
                                     this.Grid_view.Rows.Add();
                                     this.Grid_view.Rows[i].Cells[0].Value = i + 1;
                                     this.Grid_view.Rows[i].Cells[1].Value = computer.Name.ToString();
                                     IPHostEntry iphe = null;
                                     try
                                     ...{
                                         iphe = Dns.GetHostByName(computer.Name.ToString());
                                         this.Grid_view.Rows[i].Cells[2].Value = iphe.AddressList[0].ToString();
                                         ipAddress = iphe.AddressList[0].ToString();
                                         this.Grid_view.Rows[i].Cells[3].Value = GetMacAddress();                                 }
                                     catch
                                     ...{
                                         continue;
                                     }
                                     this.Grid_view.Rows[i].Cells[4].Value = domain.Name.ToString();
                                     i++;
                                 }  
                               
                             }
                        break;
                
                }
            }
        }
    }
      

  20.   

    http://blog.csdn.net/jingang123gz/archive/2008/03/02/2141040.axpx
    这个看一下吧
      

  21.   

    想要一个C#获得局域网内机器名、IP地址的控制台程序,怎么就找不到呢?