You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

捕获局域网用户IP得到:::1,该地址是否为IPv6?附C#代码

关于捕获局域网IP出现:::1的问题解答

先给你明确答案:是的:::1本质是IPv6环回地址的一种特殊输出格式,对应标准写法::1,作用和IPv4里的127.0.0.1完全一样,都是本地机器的回环地址。

为什么会拿到这个地址?

你现在看到这个结果,大概率是因为你在本地直接访问网站(比如用localhost或者127.0.0.1打开页面),此时客户端和服务器在同一台机器上,自然会返回本地回环地址。如果要捕获局域网内其他用户的IP,得让他们通过你的服务器的局域网实际IP访问(比如你的电脑局域网IP是192.168.1.105,让同事访问http://192.168.1.105),而不是用localhost。

你的代码逻辑需要完善

从你贴的代码片段来看,你已经尝试用HTTP_X_FORWARDER_FOR来处理代理场景,但代码没写完,而且没考虑IPv6的格式问题和本地地址过滤。给你补全并优化后的完整代码:

protected void getIP()
{
    string IPaddr = string.Empty;
    // 先处理代理转发的IP(如果存在)
    if (!string.IsNullOrEmpty(HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]))
    {
        // 多个代理的话,取第一个非本地的真实IP
        var ipList = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(',');
        foreach (var ip in ipList)
        {
            string cleanIp = ip.Trim();
            // 排除本地回环地址
            if (!cleanIp.StartsWith("127.") && !cleanIp.Equals("::1") && !cleanIp.Equals(":::1"))
            {
                IPaddr = cleanIp;
                break;
            }
        }
    }
    // 如果没有代理,直接取服务器记录的远程地址
    if (string.IsNullOrEmpty(IPaddr))
    {
        IPaddr = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
    }
    // 统一IPv6回环地址的格式
    if (IPaddr.Equals(":::1"))
    {
        IPaddr = "::1";
    }
    // 输出最终结果
    Response.Write($"Your IP address is {IPaddr}");
}

额外提示

  • 如果你的场景只需要捕获IPv4地址,可以在服务器(比如IIS)的配置里禁用IPv6,或者在代码里加判断,优先选择IPv4格式的地址。
  • 测试时一定要让局域网内其他设备通过你的机器局域网IP访问,别用localhost,否则永远只能拿到回环地址。

内容的提问来源于stack exchange,提问作者jbcom41

火山引擎 最新活动