zoukankan      html  css  js  c++  java
  • c#真实IP

    C#如何获取真实IP地址
    大家获取用户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 );
        }
    
    
    }
    }

    转载:http://www.cnblogs.com/rr163/archive/2014/10/27/4053054.html

  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/taidi/p/4053550.html
Copyright © 2011-2022 走看看