大家获取用户IP地址常用的方法是

 
C# 代码   复制

string IpAddress = "";

if((HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!=null
&& HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] !=String.Empty) )

{

IpAddress=HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ;

}

else

{

HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

}

事实上,上面的代码只试用与用户只使用了1层代理,如果用户有2层,3层HTTP_X_FORWARDED_FOR 的值是:"本机真实IP,1层代理IP,2层代理IP,....." ,如果这个时候你的数据中保存IP字段的长度很小(15个字节),数据库就报错了。

实际应用中,因为使用多层透明代理的情况比较少,所以这种用户并不多。

获取用户真实IP的方法

 
C# 代码   复制
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;
namespace Common
{
/// <summary>
/// IPAddress 的摘要说明
/// </summary>
public class IPAddress : System.Web.UI.Page
{

public static Int64 toDenaryIp ( string ip )
{
Int64 _Int64 = 0;
string _ip = ip;
if ( _ip.LastIndexOf ( "." ) > -1 )
{
string[] _iparray = _ip.Split ( '.' );

_Int64 = Int64.Parse ( _iparray.GetValue ( 0 ).ToString() ) * 256 * 256 * 256 + Int64.Parse ( _iparray.GetValue ( 1 ).ToString() ) * 256 * 256 + Int64.Parse ( _iparray.GetValue ( 2 ).ToString() ) * 256 + Int64.Parse ( _iparray.GetValue ( 3 ).ToString() ) - 1;
}
return _Int64;
}

/// <summary>
/// /ip十进制
/// </summary>
public static Int64 DenaryIp
{
get {
Int64 _Int64 = 0;

string _ip = IP;
if ( _ip.LastIndexOf ( "." ) > -1 )
{
string[] _iparray= _ip.Split ( '.' );

_Int64 = Int64.Parse ( _iparray.GetValue ( 0 ).ToString() ) * 256 * 256 * 256 + Int64.Parse ( _iparray.GetValue ( 1 ).ToString() ) * 256 * 256 + Int64.Parse ( _iparray.GetValue ( 2 ).ToString() ) * 256 + Int64.Parse ( _iparray.GetValue ( 3 ).ToString() )-1;
}
return _Int64;
}
} public static string IP
{
get
{
string result = String.Empty;
result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if ( result != null && result != String.Empty )
{
//可能有代理
if ( result.IndexOf ( "." ) == -1 ) //没有"."肯定是非IPv4格式
result = null;
else
{
if ( result.IndexOf ( "," ) != -1 )
{
//有",",估计多个代理。取第一个不是内网的IP。
result = result.Replace ( " ", "" ).Replace ( "", "" );
string[] temparyip = result.Split ( ",;".ToCharArray() );
for ( int i = 0; i < temparyip.Length; i++ )
{
if ( IsIPAddress ( temparyip[i] )
&& temparyip[i].Substring ( 0, 3 ) != "10."
&& temparyip[i].Substring ( 0, 7 ) != "192.168"
&& temparyip[i].Substring ( 0, 7 ) != "172.16." )
{
return temparyip[i]; //找到不是内网的地址
}
}
}
else if ( IsIPAddress ( result ) ) //代理即是IP格式
return result;
else
result = null; //代理中的内容 非IP,取IP
} } string IpAddress = ( HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null && HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != String.Empty ) HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] : HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; if ( null == result || result == String.Empty )
result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; if ( result == null || result == String.Empty )
result = HttpContext.Current.Request.UserHostAddress; return result;
}
} //是否ip格式
public static bool IsIPAddress ( string str1 )
{
if ( str1 == null || str1 == string.Empty || str1.Length < 7 || str1.Length > 15 ) return false; string regformat = @"^\\d{1,3}[\\.]\\d{1,3}[\\.]\\d{1,3}[\\.]\\d{1,3}$"; Regex regex = new Regex ( regformat, RegexOptions.IgnoreCase );
return regex.IsMatch ( str1 );
} }
}

C#如何获取真实IP地址的更多相关文章

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

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

  2. JSP 获取真实IP地址的代码

    [转载]JSP 获取真实IP地址的代码 JSP 获取真实IP地址的代码 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.   ...

  3. 【转载】JSP 获取真实IP地址的代码

    JSP 获取真实IP地址的代码 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.   但是在通过了 Apache,Squid ...

  4. java 获取真实ip地址

    /** * 获取真实ip地址 * @param request * @return */ public static String getIpAddress(HttpServletRequest re ...

  5. C#获取真实IP地址实现方法

    通常来说,大家获取用户IP地址常用的方法是: string IpAddress = ""; if((HttpContext.Current.Request.ServerVariab ...

  6. java 客户端获取真实ip地址

    在开发工作中,我们常常需要获取客户端的IP.一般获取客户端的IP地址的方法是:request.getRemoteAddr();但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实 ...

  7. php获取真实ip地址(转)

    REMOTE_ADDR只能获取访问者本地连接中设置的IP,如中南民族大学校园网中自己设置的10.X.XXX.XXX系列IP,而这个函数获取的是局域网网关出口的IP地址, 如果访问者使用代理服务器,将不 ...

  8. Nginx反向代理 Laravel获取真实IP地址(PHP)

    使用VUE前后端分离开发 后端使用Laravel  想要获取到用户的真实IP地址 因为分离开发不同源跨域问题 所以只能进行前端Nginx反向代理 location /api { rewrite ^/a ...

  9. 获取客户机MAC地址 根据IP地址 获取机器的MAC地址 / 获取真实Ip地址

    [DllImport("Iphlpapi.dll")] private static extern int SendARP(Int32 dest, Int32 host, ref ...

随机推荐

  1. IO流02_文件过滤器

    [简述] 在File类的list方法中可以接收一个FilenameFilter参数,通过该参数可以列出只满足要求的文件. FilenameFilter接口里包含了一个accept(File dir, ...

  2. leetcode problem 42 -- Trapping Rain Water

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  3. FBWF和EWF的对比

    最近在公司接触了嵌入式的wes7系统,wes7和wes2009是组件化的windows系统,除具有最新版的windows功能之外还具有适用于嵌入式系统的一些嵌入式功能,如例如EWF,FBWF. FBW ...

  4. python中functools.wraps装饰器的作用

    functools.wraps装饰器用于显示被包裹的函数的名称 import functools def node(func): #@functools.wraps(func) def wrapped ...

  5. Android分类前言

    柚子园项目搁置后,半年多时间里都在开发微信公众平台和在公司实习,用的都是python,django,bottle,已经很久没有开发android了.技术的东西,不用就容易生疏甚至忘掉.刚好现在需要写毕 ...

  6. Authentication for the REST APIs

    HTTP基本认证原理 在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份认证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户端未被 ...

  7. Linux-ubuntu

    在VMware安装ubuntu时磁盘分配如下: /boot 100MB / 2G swap 512MB /home 5G /var 1G /usr 5G+. 设置root权限:sudo passwd ...

  8. 粗略阅读《Agile Software Development》后的感想

    大致配合翻译和词典阅读了一下这篇文章之后,我另外还查阅了维基百科.百度百科和MBA智库百科还有一些网络上的文章.对敏捷开发有了一个大致上的浅显的认识. 敏捷建模(Agile Modeling,AM)的 ...

  9. webView 加载本地文件 - html/htm pdf docx tx

    - (void)viewDidLoad { [super viewDidLoad]; [self setupUI]; NSString *path = [[NSBundle mainBundle] p ...

  10. UIApplication sharedApplication 的常用使用方法-b

    下面是这个类的一些功能:1.设置icon上的数字图标 //设置主界面icon上的数字图标,在2.0中引进, 缺省为0 [UIApplicationsharedApplication].applicat ...