我在近期项目里面去记录异常日志时,用到了这两个地址,也是从网上和前辈那里学习到的,本人项目是MVC框架的,自己整理了一个公共方法类,包括获取远程客户端IP和Mac地址,以及获取本机Mac地址的方法,代码如下:

 using System;
using System.Management;
using System.Runtime.InteropServices;
using System.Web; namespace St_Te.Ultity
{
/// <summary>
/// 获取IP和Mac地址的方法类
/// </summary>
public class GetIPandMac
{
/// <summary>
/// 获取客户端IP地址
/// </summary>
public static string GetIP()
{
return HttpContext.Current.Request.UserHostAddress;
} /// <summary>
/// 获取本机Mac地址
/// </summary>
/// <returns></returns>
public static string GetMac()
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection mocollection = mc.GetInstances(); foreach (ManagementObject mo in mocollection)
{
if ((bool)mo["IPEnabled"] == true)
{
var mac = mo["MacAddress"].ToString();
mo.Dispose();
return mac;
}
}
return "";
} [DllImport("Iphlpapi.dll")]
private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);
[DllImport("Ws2_32.dll")]
private static extern Int32 inet_addr(string ip); /// <summary>
/// 获取客户端Mac地址
/// </summary>
/// <returns></returns>
public static string GetClientMAC()
{
string mac = string.Empty;
// 在此处放置用户代码以初始化页面
try
{
if (HttpContext.Current.Request.UserHostAddress != null)
{
string strClientIP = HttpContext.Current.Request.UserHostAddress.Trim();
int ldest = inet_addr(strClientIP); //目的地的ip
inet_addr("");
long macinfo = new Int64();
int len = ;
SendARP(ldest, , ref macinfo, ref len);
string macSrc = macinfo.ToString("X");
while (macSrc.Length < )
{
macSrc = macSrc.Insert(, "");
}
for (int i = ; i < ; i++)
{
if ( == (i % ))
{
if (i == )
{
mac = mac.Insert(, macSrc.Substring(i, ));
}
else
{
mac = "-" + mac.Insert(, macSrc.Substring(i, ));
} }
}
}
}
catch (Exception ex)
{
throw ex;
}
return mac;
}
}
}

说明一下,获取IP地址的方法,如果直接在controller里面获取,则这样写:

var ip = Request.UserHostAddress;

获取Mac地址的方法里引用了ManagementClass类,需要添加System.Management.dll的引用。

ManageMentClass 对象被实例化时,根据初始化参数的不同能够获取不同的本地信息:

"Win32_NetworkAdapterConfiguration" 获取本机网络适配器对象。据此可以获取网络地址等。

"Win32_DiskDiver" 获取本机硬盘的相关信息,

"Win32_Processor" 获取本机CPU相关的信息。

"Win32_OperatingSystem" 获取内存等相关信息。

/***************************我是可爱的分割线*******************************/

获取远程请求的IP地址、本机Mac地址和客户端Mac地址的更多相关文章

  1. Java Web应用中获取用户请求相关信息,如:IP地址、操作系统、浏览器等信息

    引入jar包 <dependency> <groupId>eu.bitwalker</groupId> <artifactId>UserAgentUti ...

  2. Nginx 反向代理时获取用户的真实 IP

    在平时我们开发后端程序的过程中,应该多多少少都会碰到记录客户端 IP 的场景,例如我之前写过的 APP 用户的一个审计功能,就需要获取用户的 IP 地址:还有广告系统里面,也是需要获取用户的 IP 地 ...

  3. Ngxin 开启CDN 日志获取不了真实IP的解决办法。

    nginx配置里面在http{ 后加入如下两行代码即可: set_real_ip_from 0.0.0.0/0;real_ip_header X-Forwarded-For; 重启nginx生效. 注 ...

  4. 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;

    package com.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.htt ...

  5. 阿里云X-Forwarded-For 发现tomcat记录的日志所有来自于SLB转发的IP地址,不能获取到请求的真实IP。

    1.背景:阿里云的SLB的负载均衡,在tomcat中获取不到真实IP,而是阿里的内网IP,SLB中俩台或者3台本身是局域网,这里是SLB原理,能够看看.没怎么看懂.呵呵,要细细读下. 2.须要开启to ...

  6. 通过Request对象获取请求的IP地址

    /** * 标识要从哪些消息头中获取IP地址 */ private static final String[] getIpArray = {"HTTP_X_FORWARDED_FOR&quo ...

  7. java后端通过request对象获取请求的ip地址工具类

    package cn.zgjkw.battalion.util; import org.apache.log4j.Logger; import javax.servlet.http.HttpServl ...

  8. ansible获取远程机器上的ip地址

    问题: 想要使用ansible-playbook脚本创建一个以远程机器的IP命名的目录 错误的代码:# vim test.yml --- - hosts: all remote_user: root ...

  9. JAVA获取请求的IP地址

    private static final String[] ADDR_HEADER = { "X-Forwarded-For", "Proxy-Client-IP&quo ...

随机推荐

  1. JNI传递字符串数组J-StringArray

    编译器对语言的转换以寻地址的方式进行序列化和反序列化,因此对于不固定类型或者不显示给出大小的对象不能直接解析,所以没有出现jstringArray这样的类型,只能一个一个编写. 参考链接:安卓开发提高 ...

  2. windows 实时性

    在硬件编程时,大部分非智能硬件并没有主动通知反馈功能,需要PC主动轮询状态寄存器去查询硬件状态.对于运动类控制器,查询的时机(间隔)在一定程度上影响着准确率与系统负载.即使不考虑系统负载,在1000H ...

  3. 【WPS】表格使用VBA宏编程写入ini文件实现软件多语言

    前言:公司软件最近在做多语言版本,而又来一个西班牙文版本的,之前已经做过中文版本,英文版本和法文版本,之前是同事做的,现在安排我做,之前的做法,使用wps表格,翻译好,然后一个一个复制粘贴到ini文件 ...

  4. ADB 命令和monkey

    一.概要 1.什么是adb? adb全称为Android Debug Bridge,就是起到调试桥的作用.顾名思义,adb就是一个debug工具. 2.adb工作原理 不是很理解?那就来看看它的工作原 ...

  5. CallableStatement的用法

    CallableStatement 对象为所有的 DBMS 提供了一种以标准形式调用已储存过程的方法.已储存过程储存在数据库中.对已储存过程的调用是 CallableStatement 对象所含的内容 ...

  6. 切换原生appium里面H5页面

    #coding = utf-8from appium import webdriverimport time'''1.手机类型2.版本3.手机的唯一标识 deviceName4.app 包名appPa ...

  7. eas之导入导出

    // 是否仅导出有数据的区域,该方法对所有的导出生效(默认为false)table.getIOManager().setExpandedOnly(true); 输入KDF 如果你已经有了一个完整的KD ...

  8. vfs:open.c 源码学习

    nameidata路径查找辅助结构 open.c @do_sys_open @get_unused_fd_flags @do_filp_open 1.开始填充nameidata 2.开始填充file ...

  9. 原生js封装ajax,深入理解$.ajax()

    直接上代码 //封装的ajax函数 // 传一个对象,所有要用的参数都在对象中 因为不写对象 实参列表个数太多,所以像jq一样,调用ajax也是把对象当实际参数传进去 // type 请求方式 默认g ...

  10. linux vi面板如何复制一行

    linux vi面板如何复制一行 1)把光标移动到要复制的行上 2)按yy 3)把光标移动到要复制的位置 4)按p