2 wei guanghui Wei_Guanghui 于 2014.12.12 12:48 提问

这段代码怎么解释。。

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

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

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

        if (string.IsNullOrEmpty(result) || !Regex.IsMatch(result, 
        @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$"))
        {
            return "127.0.0.1";
        }

        return result;
    }

3个回答

caozhy
caozhy   Ds   Rxr 2014.12.12 12:53

public static string GetIP()
{
string result = String.Empty;
result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 如果有代理,返回代理服务器报告的原始ip(而不是代理主机的ip)
if (string.IsNullOrEmpty(result))
{
result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 返回主机ip
}

    if (string.IsNullOrEmpty(result))
    {
        result = HttpContext.Current.Request.UserHostAddress; 这一步实际上多余,UserHostAddress就是remote_addr
    }

    if (string.IsNullOrEmpty(result) || !Regex.IsMatch(result,  
    @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$")) 如果没有ip,比如说内网回环,那么返回127.0.0.1是对的,但是如果是ipv6 ip,这么返回是不对的。总之,这样写简单粗暴且欠考虑。
    {
        return "127.0.0.1";
    }

    return result;
}
guwei4037
guwei4037   Ds   Rxr 2014.12.12 12:53

就是获取IP的方法。判断了3次,如果前面3个方法都没有的话或者结果不符合IP地址规则的话,最终返回127.0.0.1.

linustd
linustd   2014.12.12 13:32

这段代码是错误!
因为正则表达式匹配时,没有考虑IPv6.

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!