JSP获得客服端MAC地址

2
在网上看到的,感觉挺实用的就转过来。
001 packagecom.sun.servlet;
002   
003 importjava.io.IOException;
004 importjava.net.DatagramPacket;
005 importjava.net.DatagramSocket;
006 importjava.net.InetAddress;
007 /**
008  * 主机A向主机B发送“UDP-NetBIOS-NS”询问包,即向主机B的137端口,发Query包来询问主机B的NetBIOS Names信息。
009  * 其次,主机B接收到“UDP-NetBIOS-NS”询问包,假设主机B正确安装了NetBIOS服务........... 而且137端口开放,则主机B会向主机A发送一个“UDP-NetBIOS-NS”应答包,即发Answer包给主机A。
010  * 并利用UDP(NetBIOS Name Service)来快速获取远程主机MAC地址的方法
011  * 
012  * @author WINDY
013  */
014 publicclassUdpGetClientMacAddr {
015     privateString sRemoteAddr;
016     privateintiRemotePort=137;
017     privatebyte[] buffer =newbyte[1024];
018     privateDatagramSocket ds=null;
019   
020     publicUdpGetClientMacAddr(String strAddr)throwsException{
021         sRemoteAddr = strAddr;
022         ds =newDatagramSocket();
023     }
024   
025     protectedfinalDatagramPacket send(finalbyte[] bytes)throwsIOException {
026         DatagramPacket dp =newDatagramPacket(bytes,bytes.length,InetAddress.getByName(sRemoteAddr),iRemotePort);
027         ds.send(dp);
028         returndp;
029     }
030   
031     protectedfinalDatagramPacket receive()throwsException {
032         DatagramPacket dp =newDatagramPacket(buffer,buffer.length);
033         ds.receive(dp);
034         returndp;
035     }
036     protectedbyte[] GetQueryCmd()throwsException {
037         byte[] t_ns =newbyte[50];
038         t_ns[0] =0x00;
039         t_ns[1] =0x00;
040         t_ns[2] =0x00;
041         t_ns[3] =0x10;
042         t_ns[4] =0x00;
043         t_ns[5] =0x01;
044         t_ns[6] =0x00;
045         t_ns[7] =0x00;
046         t_ns[8] =0x00;
047         t_ns[9] =0x00;
048         t_ns[10] =0x00;
049         t_ns[11] =0x00;
050         t_ns[12] =0x20;
051         t_ns[13] =0x43;
052         t_ns[14] =0x4B;
053   
054         for(inti =15; i <45; i++){
055             t_ns[i] =0x41;
056         }
057         t_ns[45] =0x00;
058         t_ns[46] =0x00;
059         t_ns[47] =0x21;
060         t_ns[48] =0x00;
061         t_ns[49] =0x01;
062         returnt_ns;
063     }
064     protectedfinalString GetMacAddr(byte[] brevdata)throwsException {
065         // 获取计算机名
066         inti = brevdata[56] *18+56;
067         String sAddr="";
068         StringBuffer sb =newStringBuffer(17);
069         // 先从第56字节位置,读出Number Of Names(NetBIOS名字的个数,其中每个NetBIOS Names Info部分占18个字节)
070         // 然后可计算出“Unit ID”字段的位置=56+Number Of Names×18,最后从该位置起连续读取6个字节,就是目的主机的MAC地址。
071         for(intj =1; j <7;j++)
072         {
073             sAddr = Integer.toHexString(0xFF& brevdata[i+j]);
074             if(sAddr.length() <2)
075             {
076                 sb.append(0);
077             }
078             sb.append(sAddr.toUpperCase());
079             if(j <6) sb.append(':');
080         }
081         returnsb.toString();
082     }
083   
084     publicfinalvoidclose() {
085         try
086         {
087             ds.close();
088         }
089         catch(Exception ex){
090             ex.printStackTrace();
091         }
092     }
093   
094     publicfinalString GetRemoteMacAddr()throwsException {
095         byte[] bqcmd = GetQueryCmd();
096         send(bqcmd);
097         DatagramPacket dp = receive();
098         String smac = GetMacAddr(dp.getData());
099         close();
100   
101         returnsmac;
102     }
103 }
JSP文件:
01 <spanstyle="color:#000000;"><%
02                 String smac = "";
03                 String sip = request.getHeader("x-forwarded-for");
04                 if (sip == null || sip.length() == 0
05                         || "unknown".equalsIgnoreCase(sip)) {
06                     sip = request.getHeader("Proxy-Client-IP");
07                 }
08                 if (sip == null || sip.length() == 0
09                         || "unknown".equalsIgnoreCase(sip)) {
10                     sip = request.getHeader("WL-Proxy-Client-IP");
11                 }
12                 if (sip == null || sip.length() == 0
13                         || "unknown".equalsIgnoreCase(sip)) {
14                     sip = request.getRemoteAddr();
15                 }
16                 UdpGetClientMacAddr umac = new UdpGetClientMacAddr(sip);
17                 smac = umac.GetRemoteMacAddr();
18                 session.setAttribute("smac", smac);
19             %></span>

转载于:https://my.oschina.net/wyunsh5168/blog/151942

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值