|
在网上看到的,感觉挺实用的就转过来。
001 | packagecom.sun.servlet; |
003 | importjava.io.IOException; |
004 | importjava.net.DatagramPacket; |
005 | importjava.net.DatagramSocket; |
006 | importjava.net.InetAddress; |
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地址的方法 |
014 | publicclassUdpGetClientMacAddr { |
015 | privateString sRemoteAddr; |
016 | privateintiRemotePort=137; |
017 | privatebyte[] buffer =newbyte[1024]; |
018 | privateDatagramSocket ds=null; |
020 | publicUdpGetClientMacAddr(String strAddr)throwsException{ |
021 | sRemoteAddr = strAddr; |
022 | ds =newDatagramSocket(); |
025 | protectedfinalDatagramPacket send(finalbyte[] bytes)throwsIOException { |
026 | DatagramPacket dp =newDatagramPacket(bytes,bytes.length,InetAddress.getByName(sRemoteAddr),iRemotePort); |
031 | protectedfinalDatagramPacket receive()throwsException { |
032 | DatagramPacket dp =newDatagramPacket(buffer,buffer.length); |
036 | protectedbyte[] GetQueryCmd()throwsException { |
037 | byte[] t_ns =newbyte[50]; |
054 | for(inti =15; i <45; i++){ |
064 | protectedfinalString GetMacAddr(byte[] brevdata)throwsException { |
066 | inti = brevdata[56] *18+56; |
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++) |
073 | sAddr = Integer.toHexString(0xFF& brevdata[i+j]); |
074 | if(sAddr.length() <2) |
078 | sb.append(sAddr.toUpperCase()); |
079 | if(j <6) sb.append(':'); |
084 | publicfinalvoidclose() { |
090 | ex.printStackTrace(); |
094 | publicfinalString GetRemoteMacAddr()throwsException { |
095 | byte[] bqcmd = GetQueryCmd(); |
097 | DatagramPacket dp = receive(); |
098 | String smac = GetMacAddr(dp.getData()); |
JSP文件:
01 | <spanstyle="color:#000000;"><% |
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"); |
08 | if (sip == null || sip.length() == 0 |
09 | || "unknown".equalsIgnoreCase(sip)) { |
10 | sip = request.getHeader("WL-Proxy-Client-IP"); |
12 | if (sip == null || sip.length() == 0 |
13 | || "unknown".equalsIgnoreCase(sip)) { |
14 | sip = request.getRemoteAddr(); |
16 | UdpGetClientMacAddr umac = new UdpGetClientMacAddr(sip); |
17 | smac = umac.GetRemoteMacAddr(); |
18 | session.setAttribute("smac", smac); |
|
转载于:https://my.oschina.net/wyunsh5168/blog/151942