`
liufei.fir
  • 浏览: 687196 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

获取客户机IP地址

阅读更多
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地址代码

    在IT领域,特别是Web开发中,获取客户端IP地址是一项基本且重要的功能,它不仅用于统计访问数据、地域分析,还广泛应用于安全控制、用户个性化设置等场景。本文将深入探讨如何在ASP(Active Server Pages)及ASP.NET...

    ASP.NET获取客户机IP和MAC地址 另一版本源代码

    ### ASP.NET获取客户机IP地址 #### 代码解析: 在C#中,使用`.NET Framework`中的`System.Net`命名空间可以轻松获取客户端的IP地址。具体实现如下: ```csharp string hostInfo = Dns.GetHostName(); System.Net....

    客户机IP获取

    综上所述,获取客户机IP地址主要通过HTTP请求头,而“姓名数字和字母判断”通常用于验证用户输入的合法性。这两项技术在Web开发和脚本编写中都有着广泛的应用。理解并掌握这些基础知识对于IT从业者来说至关重要。

    JSP如何获取客户端真实IP地址

    这种方法在大部分情况下都是有效的,但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 如果使用了反向代理软件,将http://192.168.1.110:3306/ 的URL反向代理为http://www.8888.com/ 的...

    jsp获取客户端IP地址的方法

    在Java语言开发的Web应用中,尤其是在使用Java Server Pages(JSP)技术时,获取客户端的IP地址是常见的需求之一,这可以用于日志记录、用户访问统计、安全性检查等多种场景。本文详细介绍了几种在JSP中获取客户端IP...

    ASP.NET获取客户机IP和MAC地址

    在IT领域,特别是Web开发中,获取客户端的IP地址和MAC地址是常见的需求之一,尤其在需要进行网络追踪、安全验证或数据统计等场景下。本文将深入解析如何在ASP.NET环境中实现这一功能,通过分析给定的源代码示例,...

    JS获取客户端IP地址、MAC和主机名的7个方法汇总

    将`0.0.0.0`替换为客户机的真实IP地址即可。 **应用场景**: - 适用于需要根据客户端IP地址进行地理定位的场景,如电商网站自动识别用户所在城市并提供相应服务。 --- #### 二、使用JS获取计算机名、MAC地址、...

    获取客户端网卡MAC地址和IP地址实现JS代码

    在做B/S结构的系统时,我们常常需要获取客户端的一些信息,如IP和MAC,以结合身份验证。要获取服务器端的MAC很容易,但是要获取客户端的MAC的地址确要花费一翻心思,通常的做法是调用Win32API或直接调用nbtstat命令...

    js获取mac地址、ip地址.html

    JS获取计算机mac地址以及IP和用户名的实现方法,只适用于IE且activeX开启

    获取客户机的IP,计算机名

    在IT行业中,获取客户机的IP地址和计算机名是网络编程中的常见需求,尤其是在服务器端进行数据分析、安全控制或者个性化服务提供时。本篇将详细解释如何实现这一目标,主要针对Asp.Net环境,同时也涉及一些通用的...

    获取主机用户名和IP

    - 编程方式:在Python中,可以使用`socket.gethostbyname(socket.gethostname())`获取本机IP,使用`socket`库的`connect()`方法连接远程服务器并获取其IP。在Java中,可以使用`InetAddress.getLocalHost()....

    电脑无法自动获取IP地址怎么办?.docx

    这是系统自动分配的IP地址范围,当客户机无法从DHCP服务器获取IP地址时,系统会自动分配一个IP地址在这个范围内。 3. RPC服务的作用 RPC服务是Remote Procedure Call的缩写,是一种远程过程调用机制,用于提供系统...

    查看本机电脑外网IP地址 可查历史记录

    同时,对于企业来说,如果服务器IP经常变动可能会影响客户的访问体验,因此需要关注IP地址的稳定性。 此外,隐私保护也是个不容忽视的话题。虽然IP地址本身不包含个人信息,但结合其他数据,可能泄露用户的地理位置...

    以IP来获取客户端电脑名称(一句代码实现)

    公司的域环境内,要求获取客户端的电脑名称,其实程序原开始,只是要求 获取客户端IP地址 后来演变成要求显示客户端的电脑名称。作为开发者,只有不停地实现客户的要求。 其实既然IP获取到了,那可以轻易以IP来获取...

    jQuery 获取浏览器所在的IP地址的小例子

    首先,需要了解jQuery是一个轻量级的JavaScript库,其设计目的是使客户机端的JavaScript编程变得更加简单。通过使用jQuery,开发者可以更快速地编写能够跨多种浏览器运行的代码。jQuery提供了一套丰富的API,包括...

    Chrome获取MAC地址扩展程序

    "Chrome获取MAC地址扩展程序"是一个专门设计用于在Chrome环境中获取计算机物理地址(即MAC地址)的插件。MAC地址是网络设备如网卡的唯一标识符,通常用于局域网内的设备识别和通信。在描述中提到,这个扩展程序利用...

    SANGFOR_aDesk_瘦客户机自动配置中心管理器地址.pdf

    为了解决瘦客户机访问独享桌面时的手动配置问题,文档提出了一个解决方案,即在 VDC 控制台开启 DHCP 服务或者在第三方服务器上开启 DHCP 服务,让瘦客户机在开机后,自动获取 IP 的同时,自动配置中心管理器地址。...

    查询手机外网IP和获取手机运营商

    当我们谈论“查询手机外网IP和获取手机运营商”时,这里涉及到了两个关键概念:公网IP地址和移动网络运营商信息。公网IP地址是互联网上设备的唯一标识,而手机运营商信息则与手机所接入的网络服务提供商有关。下面将...

    获取mac地址

    获取MAC地址的几种方法的一个类,希望能对大家有所帮助。

Global site tag (gtag.js) - Google Analytics