package org.liufei.jweb;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* 向指定的137端口发出固定格式的查询命令,返回结果中即含有客户端mac地址
*
* @author liufei
*
*/
public class UDPGetClientMac {
private String remote_address;
private static final int REMOTE_PORT = 137;
private static final byte[] BUFFER = new byte[1024];
private DatagramSocket datagram_socket = null;
public static void main(String[] args) throws SocketException, IOException {
System.out.println(UDPGetClientMac.getRemoteHostMacAddress("172.16.0.11"));
}
public static String getRemoteHostMacAddress(String address) throws SocketException, IOException {
return new UDPGetClientMac(address).getRemoteHostMacAddress() ;
}
private UDPGetClientMac(String address) throws SocketException {
remote_address = address;
datagram_socket = new DatagramSocket();
}
private final DatagramPacket send(final byte[] bytes) throws IOException {
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress
.getByName(remote_address), REMOTE_PORT);
datagram_socket.send(datagramPacket);
return datagramPacket;
}
private final DatagramPacket receive() throws IOException {
DatagramPacket datagramPacket = new DatagramPacket(BUFFER, BUFFER.length);
datagram_socket.receive(datagramPacket);
return datagramPacket;
}
/**
* 询问包结构:
* Transaction ID 两字节(16位) 0x00 0x00
* Flags 两字节(16位) 0x00 0x10
* Questions 两字节(16位) 0x00 0x01
* AnswerRRs 两字节(16位) 0x00 0x00
* AuthorityRRs 两字节(16位) 0x00 0x00
* AdditionalRRs 两字节(16位) 0x00 0x00
* Name:array [12..45] 0x20 0x43 0x4B 0x41(30个) 0x00 ;
* Type:NBSTAT 两字节 0x00 0x21
* Class:INET 两字节(16位)0x00 0x01
*
* @return
* @throws Exception
*/
private final byte[] queryCmd() {
byte[] t_ns = new byte[50];
t_ns[0] = 0x00;// transaction[0]
t_ns[1] = 0x00;// transaction[1]
t_ns[2] = 0x00;// flags[0]
t_ns[3] = 0x10;// flags[1]
t_ns[4] = 0x00;// questions[0]
t_ns[5] = 0x01;// questions[1]
t_ns[6] = 0x00;
t_ns[7] = 0x00;
t_ns[8] = 0x00;
t_ns[9] = 0x00;
t_ns[10] = 0x00;
t_ns[11] = 0x00;
t_ns[12] = 0x20;
t_ns[13] = 0x43;
t_ns[14] = 0x4B;
for (int i = 15; i < 45; i++) {
t_ns[i] = 0x41;
}
t_ns[45] = 0x00;
t_ns[46] = 0x00;// nbstat
t_ns[47] = 0x21;// nbstat
t_ns[48] = 0x00;
t_ns[49] = 0x01;
return t_ns;
}
/**
* 表1 “UDP-NetBIOS-NS”应答包的结构及主要字段一览表
* 序号 字段名 长度
* 1 Transaction ID 两字节(16位)
* 2 Flags 两字节(16位)
* 3 Questions 两字节(16位)
* 4 AnswerRRs 两字节(16位)
* 5 AuthorityRRs 两字节(16位)
* 6 AdditionalRRs 两字节(16位)
* 7 Name<Workstation/Redirector> 34字节(272位)
* 8 Type:NBSTAT 两字节(16位)
* 9 Class:INET 两字节(16位)
* 10 Time To Live 四字节(32位)
* 11 Length 两字节(16位)
* 12 Number of name 一个字节(8位),名字长度---56
* NetBIOS Name Info 18×Number Of Name字节--占 这么多的字节
* Unit ID 6字节(48位)-->接下来就是mac地址
*
* @param brevdata
* @return
* @throws Exception
*/
private final String getHostMacAddress(byte[] brevdata) {
int i = brevdata[56] * 18 + 56;
String address = "";
StringBuffer result = new StringBuffer(17);
for (int j = 1; j < 7; j++) {
address = Integer.toHexString(0xFF & brevdata[i + j]);
if (address.length() < 2) {
result.append(0);
}
result.append(address.toUpperCase());
if (j < 6) {
result.append(':');
}
}
return result.toString();
}
private final void close() {
if(datagram_socket != null) {
datagram_socket.disconnect() ;
datagram_socket.close() ;
}
}
private final String getRemoteHostMacAddress() throws IOException {
byte[] cmd_byte = this.queryCmd();
this.send(cmd_byte);
DatagramPacket datagramPacket = this.receive();
String smac = this.getHostMacAddress(datagramPacket.getData());
this.close();
return smac;
}
}
分享到:
相关推荐
Asp及asp.net获取客户机ip地址代码
ASP.NET获取客户机IP和MAC地址的源代码
ASP.NET获取客户机IP和MAC地址 另一版本源代码
JS获取计算机mac地址以及IP和用户名的实现方法,只适用于IE且activeX开启
.net 通过后台代码获取客户端的主机ip地址和客户端主机名。
公司的域环境内,要求获取客户端的电脑名称,其实程序原开始,只是要求 获取客户端IP地址 后来演变成要求显示客户端的电脑名称。作为开发者,只有不停地实现客户的要求。 其实既然IP获取到了,那可以轻易以IP来获取...
实现chrome获取MAC地址的扩展。 通过c++获取MAC地址,然后通过Chrome native message 技术调用C++程序,在javascript中获取MAC地址
获取MAC地址的几种方法的一个类,希望能对大家有所帮助。
获取远程客户机的IP地址 创建一个IPEndPoint对象 创建一个TcpListener对象 创建一个基于TCP协议的Socket对象 创建一个基于UDP协议的Socket对象 获取本地终结点 获取TcpListener对象的本地终结点 获取Socket对象...
获取远程客户机的IP地址 创建一个IPEndPoint对象 创建一个自动分配IP和端口的TcpListener对象 创建一个TcpListener对象 创建一个基于TCP协议的Socket对象 创建一个基于UDP协议的Socket对象 获取TcpListener...
实现技术 DHCP 服务器可以让管理员集中指派和指定全局的和子网特有的 TCP/IP 参数 (含 IP 地 址、网关、DNS 服务器等)供整个网络使用,客户机不需要手动配置 TCP/IP;并且,当客 户机断开与服务器的连接后,旧的 ...
ecshop收货地址真伪性验证插件 给你的商城开通“货到付款”功能,...1、后台订单信息自动获取用户登录IP地址、手机号码归属地。 2、点击IP地址,可自动获得相应具体地址。 3、点击手机号码,可获得相应具体归属地信息。
获取客户机的名称: 0:0:0:0:0:0:0:1 获取服务器的名称: localhost 获取服务器的端口号: 48090 获取客户端提交的所有参数的名字: 获取头名字的一个 枚举: host connection cache-control accept user-agent ...
其实这个很简单,只不过我一直想用 ipv6-test 的API做一个获取用户IP地址的东西……无奈JSON获取到的只是本机服务器的IP。算了,不研究了,何况人家提供的widget也挺好用的。谷歌了一下,找到这段代码,可以根据用户...
这是一个能够通过Ip,获取该IP所在位置,例如通过ip: 171.12.10.156获得是中国河南郑州,以及中国行政区划代码(支持到市级),同样能获得国外的地址,但是没有国内详细。 注意:该免费数据库不提供经纬度,运营商...
php获取客户机ip及物理地址,thinkphp框架常用代码。。。
手工配置TCP/IP 使用DHCP服务配置TCP/IP 用户最好从网络管理员处获得一个有效的IP地址,当然也可以随意地反指定一个IP地址,但使用不正确的IP地址将导致无法获得资源网络 用户不再需要从管理员获取IP地址信息来配置...
CentOS 6.5 DHCP服务器配置... 客户机获取不到ip地址,检查iptables是否开启,如果开启,可以关闭或者配置放 行规则。 ----------------------- CentOS-6全文共2页,当前为第1页。 CentOS-6全文共2页,当前为第2页。
然后客户机更改为自动获取IP地址,再打开CMD窗口,使用命令ipconfig/relea se命令释放ip,接着用命令ipconfig/renew命令来获取ip地址 保留得客户机得IP地址就是否需要在该作用于范围内(在当前网段) 结论...
11.12.1 客户IP地址及端口号 122 11.12.2 目标IP地址 122 11.12.3 UDP输入队列 122 11.12.4 限制本地IP地址 124 11.12.5 限制远端IP地址 125 11.12.6 每个端口有多个接收者 125 11.13 小结 126 第12章 广播和多播 ...