您的位置:首页 > 编程语言 > C#

C#获取真实的客户端IP地址,包括内网代理

2013-09-13 21:24 417 查看

        

        分类:            

开发点滴              2012-02-21 15:17    
1245人阅读    
评论(0)    
收藏    
举报    

c#stringregexnull

[csharp]
view plaincopyprint?

public static string GetRealIP()  
{  
    string result = String.Empty;  
  
    result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];  
  
    //可能有代理   
    if (!string.IsNullOrWhiteSpace(result))  
    {  
        //没有"." 肯定是非IP格式  
        if (result.IndexOf(".") == -1)      
        {  
            result = null;  
        }  
        else  
        {  
            //有",",估计多个代理。取第一个不是内网的IP。  
            if (result.IndexOf(",") != -1)  
            {  
                result = result.Replace(" ", string.Empty).Replace("\"", string.Empty);  
  
                string[] temparyip = result.Split(",;".ToCharArray());  
  
                if (temparyip != null && temparyip.Length > 0)  
                {  
                    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];   
                        }  
                    }  
                }  
            }  
            //代理即是IP格式  
            else if (IsIPAddress(result))   
            {  
                return result;  
            }  
            //代理中的内容非IP  
            else  
            {  
                result = null;   
            }  
        }  
    }  
  
    if (string.IsNullOrWhiteSpace(result))  
    {  
        result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];  
    }  
  
    if (string.IsNullOrWhiteSpace(result))  
    {  
        result = HttpContext.Current.Request.UserHostAddress;  
    }  
  
    return result;  
}  

public static string GetRealIP()
{
string result = String.Empty;

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

//可能有代理
if (!string.IsNullOrWhiteSpace(result))
{
//没有"." 肯定是非IP格式
if (result.IndexOf(".") == -1)
{
result = null;
}
else
{
//有",",估计多个代理。取第一个不是内网的IP。
if (result.IndexOf(",") != -1)
{
result = result.Replace(" ", string.Empty).Replace("\"", string.Empty);

string[] temparyip = result.Split(",;".ToCharArray());

if (temparyip != null && temparyip.Length > 0)
{
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];
}
}
}
}
//代理即是IP格式
else if (IsIPAddress(result))
{
return result;
}
//代理中的内容非IP
else
{
result = null;
}
}
}

if (string.IsNullOrWhiteSpace(result))
{
result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}

if (string.IsNullOrWhiteSpace(result))
{
result = HttpContext.Current.Request.UserHostAddress;
}

return result;
}


[csharp]
view plaincopyprint?

public static bool IsIPAddress(string str)  
{  
    if (string.IsNullOrWhiteSpace(str) || str.Length < 7 || str.Length > 15)   
        return false;  
  
    string regformat = @"^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}{1}quot;;  
  
    Regex regex = new Regex(regformat, RegexOptions.IgnoreCase);  
  
    return regex.IsMatch(str);  
}  

public static bool IsIPAddress(string str)
{
if (string.IsNullOrWhiteSpace(str) || str.Length < 7 || str.Length > 15)
return false;

string regformat = @"^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}{1}quot;;

Regex regex = new Regex(regformat, RegexOptions.IgnoreCase);

return regex.IsMatch(str);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: