none
C#跨网段获取客户端的MAC地址?? RRS feed

答案

  • 你好!
         可以参考这个实现,希望对你有帮助:
         http://www.cnblogs.com/Deckard/archive/2009/04/07/1430807.html
    周雪峰
    • 已标记为答案 KeFang Chen 2009年10月19日 2:46
    2009年10月18日 9:29
    版主

全部回复

  • 找到一个java 的实现方法,你参考下!



    跨网段获取远程主机MAC地址的方法与java实现
    The method of requesting from remote host MAC and java application
    (1. 唐山学院; 2保定金融专科学校; 3.北京邮电大学)   郭建波1 李志明2 刘宁宁3
                                                      guo,jianbo li,zhiming liu,ningning

    摘  要  本文分析了利用SendARP方法(基于ARP协议)来获取远程主机MAC地址的缺陷,提出了一种新思路——研究并利用SNMP协议来快速获取远程主机MAC地址的方法,并给出了其在JAVA中实现的程序。
    关键词  MAC地址,远程主机,SNMP,JAVA
    中图分类号:TN911.73
    Abstract  The article analyzes the faults of requesting from remote host MAC in SendARP way,putting forward a new method, researching and applying SNMP protocol to request remote host MAC and delivering application programme in JAVA.
    Key Words MAC,remote host,SNMP,JAVA
    一、引言
    在计算机网络通信中,网卡中的信息最重要就是MAC地址,即网卡的物理地址。MAC地址固化在网卡的ROM中,不易改动。在网络通信中需要监控一台计算机的最好的方法就是获取它的MAC地址。
    获取远程主机的MAC地址,采用IpHelperAPI的SendARP方法,在跨网段情况下,它只能获取“本网段”内主机的MAC地址,如果源主机与目的主机不在同一个网段内,该方法就只能获取“网关”的MAC地址,而无法获取目的主机的MAC地址。本文利用SNMP协议从三层交换机缓存中获取到所有网段的MAC地址,采用 jawa编程,实现了获取远程主机的MAC地址,供同行借鉴。
    二、原理
     交换机是一种基于MAC(网卡的硬件地址)识别,完成封装转发数据包功能的网络设备。交换机可以"学习"MAC地址,并把其存放在内部地址表中,通过在数据帧的始发者和目标接收者之间建立临时的交换路径,使数据帧直接由源地址到达目的地址,SNMP(Simple Network Management Protocol)即简单网络管理协议为网络管理系统提供了底层网络管理的框架,通过SNMP协议来获取MAC地址速度快、效率高。
    SNMP协议定义了数据包的格式,及网络管理员和管理代理之间的信息交换,它还控制着管理代理的MIB数据对象。可处理管理代理定义的各种任务。SNMP协议对外提供了三种用于控制MIB对象的基本操作命令。它们是:Set 、Get 和 Trap。
    一条SNMP报文由三个部分组成:版本域(version field),分区域(community field)和SNMP协议数据单元域(SNMP protocol data unit field),数据包的长度不是固定的。
    版本域:这个域用于说明现在使用的是哪个版本的SNMP协议。目前,version 1是使用最广泛的SNMP协议。
    分区域:分区(community)是基本的安全机制,用于实现SNMP网络管理员访问SNMP管理代理时的身份验证。
    协议数据单元域:SNMPv1的PDU有五种类型,有些是报文请求(Request),有些则是响应(Response)。它们包括:GetRequest、GetNextRequest、SetRequest、GetResponse、Trap 。SNMPv2又增加了两种PDU:GetBulkRequest和InformRequest 。
    SNMP管理员使用GetRequest从拥有SNMP代理的网络设备中检索信息,SNMP代理以GetResponse消息响应GetRequest。可以交换很多的信息,如系统的名字,系统自启动后正常运行的时间,系统中的网络接口数等等。GetRequest和GetNextRequest结合起来使用可以获得一个表中的对象。GetRequest取回一个特定对象;而使用GetNextRequest则是请求表中的下一个对象。使用SetRequest可以对一个设备中的参数进行远程配置。Set-Request可以设置设备的名字,关掉一个端口或清除一个地址解析表中的项。Trap即SNMP陷阱,是SNMP代理发送给管理站的非请求消息。这些消息可告知管理站本设备发生了一个特定事件,如端口失败,掉电重起等,管理站可相应的作出处理。
    管理信息数据库(MIB)是一个信息存储库,它包含了管理代理中的有关配置和性能的数据,有一个组织体系和公共结构,其中包含分属不同组的许多个数据对象。
    MIB数据对象以一种树状分层结构进行组织,这个树状结构中的每个分枝都有一个专用的名字和一个数字形式的标识符。
    在三层交换机中利用SNMP协议获取CAM表的内容,实现IP与MAC的对应。其中ipNetToMeiaPhysAddress(1.3.6.1.2.1.4.22.1.2)对象用于将IP映射到物理地址的地址转换。通过SNMP查询得到类似下面的结果:
    IP-MIB::ipNetToMediaPhysAddress.42.192.168.171.37 = STRING: 0:0:e2:47:b9:16
    IP-MIB::ipNetToMediaPhysAddress.42.192.168.171.40 = STRING: 0:0:e2:43:f1:ae
    其中ipNetToMediaPhysAddress后面的42表示的是VLAN接口号,如果需要按网段得到MAC地址,ipRouteIfIndex(1.3.6.1.2.1.4.21.1.2)唯一指定本地接口的索引值,可以用来得到VLAN号,两者组合起来可以得到某一个具体网段的MAC地址。
    三、实现
     下面是采用JAVA和netsnmp4_13开发包来完成获取远程主机MAC地址的程序。
    public class getMac implements Observer
    {
        final static String myoid = "1.3.6.1.2.1.4.21.1.2";  //ipRouteIfIndex的oid
        private SnmpContextv2c context;
        private OneGetNextPdu pdu;
        private Util        util;
        private int oidlen=0;
        String oid;
        int i=0;
        private String[] oidValue=new String[50];
        boolean init=true;
    public getMac(String propertiesFilename){
        util = new Util(propertiesFilename, this.getClass().getName());
    }
    public void init ()   //首先得到vlan号
    {
        String host = util.getHost();
        int port = util.getPort(SnmpContextBasisFace.DEFAULT_PORT);
        String socketType = util.getSocketType();
        oid = util.getOid(myoid);
        String community = util.getCommunity();
        oidlen=oid.length();
        int aa=oid.lastIndexOf(".");
        try {
            context = new SnmpContextv2c(host, port, socketType);
            context.setCommunity(community);
            pdu = new OneGetNextPdu(context);
            pdu.addObserver(this);
            pdu.addOid(oid);
            pdu.send();
        }
        catch (java.io.IOException exc) {
            System.out.println("IOException " + exc.getMessage());
            System.exit(0);
        }
        catch(uk.co.westhawk.snmp.stack.PduException exc) {
            System.out.println("PduException " + exc.getMessage());
            System.exit(0);
        }
    }
    public void update(Observable obs, Object ov) //得到vlan中的mac地址表
    {
        boolean isFinished = false;
        if (pdu.getErrorStatus() == AsnObject.SNMP_ERR_NOERROR)
        {
            varbind var = (varbind) ov;
            AsnObject obj = var.getValue();
            int a=var.getOid().toString().indexOf(".",21);
            if(var.getOid().toString().substring(0,oidlen).equals(oid.substring(0,oidlen)))
            {
                pdu = new OneGetNextPdu(context);
                pdu.addObserver(this);
                if(init){
                oid="1.3.6.1.2.1.4.22.1.2."+obj.toString(); //构造ipNetToMediaPhysAddress
                 oidlen=oid.lastIndexOf(".");
               pdu.addOid(oid);
                  init=false;
                }
                else{
              System.out.print("ip="+var.getOid().toString().substring(a+1));
              System.err.println("  mac="+obj.toString().substring(2));
                 oid=var.getOid().toString();
                 pdu.addOid(oid);
                 oidlen=oid.lastIndexOf(".");
                }
                try {
                    pdu.send();
                    i++;
                }
                catch(java.io.IOException exc) {
                    System.out.println("update(): IOException "
                          + exc.getMessage());
                }
                catch(uk.co.westhawk.snmp.stack.PduException exc) {
                    System.out.println("update(): PduException "
                          + exc.getMessage());
                }
            }
            else {isFinished = true;}
        }
        else {isFinished = true; }
        if (isFinished == true) {
            System.exit(0);
        }
    }
    }
    四、结束语
    采用此方法获取(扫描)MAC地址的效率较高。在几秒钟之内能得到全网的MAC地址,网络资源消耗小。在计算机网络监控方面有很好的应用价值。
    [基金项目]国家自然科学基金资助(69975002); 唐山市重点实验室资助(04360801-3)
    作者介绍: 郭建波,男,1964,河北唐山 副教授 硕士,研究方向计算机网络及应用。
    李志明,男,讲师。  刘宁宁,教授,博士后,研究生导师。
    参考文献:
    [1] 杨旭光.. 利用ICMP实现局域网网卡地址的搜索[J]. 宜春学院学报,2004,(8)
    [2]. 邹永林,沈健. 网卡地址的识别和Windows95IP 地址的自动设置[J]. 计算机工程,2000,(9)


    不入流的程序员,简单的疯子,只为成为绝世的狂人!
    2009年10月18日 8:22
  • 你好!
         可以参考这个实现,希望对你有帮助:
         http://www.cnblogs.com/Deckard/archive/2009/04/07/1430807.html
    周雪峰
    • 已标记为答案 KeFang Chen 2009年10月19日 2:46
    2009年10月18日 9:29
    版主
  • 有没有不限制网段的,限制网段的话还是不以万能的啊!哈哈。。
    2012年8月8日 1:31