程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#獲得真實IP地址(IP轉為長整形、斷定能否內網IP的辦法)

C#獲得真實IP地址(IP轉為長整形、斷定能否內網IP的辦法)

編輯:C#入門知識

C#獲得真實IP地址(IP轉為長整形、斷定能否內網IP的辦法)。本站提示廣大學習愛好者:(C#獲得真實IP地址(IP轉為長整形、斷定能否內網IP的辦法))文章只能為提供參考,不一定能成為您想要的結果。以下是C#獲得真實IP地址(IP轉為長整形、斷定能否內網IP的辦法)正文


明天檢查登錄日記,發明http_x_forwarded_for獲得到的ip地址有些是內網ip地址,有些則是公網和內網ip地址一路獲得到,用逗號分離隔,日記截圖以下:

之前獲得ip地址的C#代碼以下:


    /// <summary>
    /// C#獲得客戶端真實IP地址
    /// </summary>
    /// <returns></returns>
    public static string GetIP()
    {
        string ip = HttpContext.Current.Request.ServerVariables["http_x_forwarded_for"];
        if (UserCheck.IsNull(ip)) ip = HttpContext.Current.Request.ServerVariables["remote_addr"];
        return ip;
    }

看來http_x_forwarded_for應當是被其他軟件或許ISP修正過了,招致http_x_forwarded_for得不到真實的署理ip地址。之前上岸日記是要斷定ip地址能否在許可的ip段內的,如許招致沒法上岸體系。最初修正代碼以下,增長斷定能否為內網或許公有地址,能否相符ipv4的地址規格,不相符照樣應用remote_addr來獲得客戶真個ip地址。

比擬平安的獲得真實地址的完成代碼:


 /// <summary>
    /// C#將IP地址轉為長整形
    /// </summary>
    /// <param name="ip"></param>
    /// <returns></returns>
    public static long IpToNumber(string ip)
    {
        string[] arr = ip.Split('.');
        return 256 * 256 * 256 * long.Parse(arr[0]) + 256 * 256 * long.Parse(arr[1]) + 256 * long.Parse(arr[2]) + long.Parse(arr[3]);
    }
    /// <summary>
    /// C#斷定IP地址能否為公有/內網ip地址
    /// </summary>
    /// <param name="ip"></param>
    /// <returns></returns>
    public static bool IsPrivateIp(string ip)
    {
        long ABegin = IpToNumber("10.0.0.0"), AEnd = IpToNumber("10.255.255.255"),//A類公有IP地址
         BBegin = IpToNumber("172.16.0.0"), BEnd = IpToNumber("172.31.255.255"),//'B類公有IP地址
         CBegin = IpToNumber("192.168.0.0"), CEnd = IpToNumber("192.168.255.255"),//'C類公有IP地址
         IpNum = IpToNumber(ip);
        return (ABegin <= IpNum && IpNum <= AEnd) || (BBegin <= IpNum && IpNum <= BEnd) || (CBegin <= IpNum && IpNum <= CEnd);
    }
    /// <summary>
    /// C#獲得真實IP地址
    /// </summary>
    /// <returns></returns>
    public static string GetIP()
    {
        string ip = HttpContext.Current.Request.ServerVariables["http_x_forwarded_for"];
        if (UserCheck.IsNull(ip)) ip = HttpContext.Current.Request.ServerVariables["remote_addr"];
        else//署理ip地址有內容,斷定能否相符ipv4地址或許能否為內網地址
        {
            ip = ip.Trim().WordStr(" ", "");
            if (!Regex.IsMatch(ip, @"^\d+(\.\d+){3}$") || IsPrivateIp(ip))
                ip = HttpContext.Current.Request.ServerVariables["remote_addr"];//不相符規矩或許內網/公有地址應用remote_addr取代
        }
        return ip;
    }

2014-07-02更新:本來是 cdn加快的成績,cdn加快後,因為先斷定http_x_forwarded_for,http_x_forwarded_for是隨意可以捏造的,放置任何內容的,所以下圖湧現的ip地址中會有內網地址或許湧現2個ip地址的成績。所以獲得http_x_forwarded_for內容時須要 split下獲得第一個項。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved