獲取客戶端IPv4的地址

哇,糾結了好幾天,爲了獲取客戶端IP地址,因爲IPv6的出現好多問題,經常會碰到一些問題。

如:獲取不到IP,有時候獲取到 了卻是IPv6的,你又未曾看到過,好吧,貼下代碼

        /// <summary>
        /// 取得客戶端主機地址
        /// </summary>
        public static string GetClientIP()
        {
            if (null != HttpContext.Current.Request.ServerVariables["HTTP_VIA"])
            {
                return HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            }
            else
            {
                return HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
            }
        }

        /// <summary>
        /// 取得客戶端主機IPv4 地址
        /// </summary>
        /// <returns></returns>
        public static string GetClientIPv4()
        {
            string ipv4 = String.Empty;

            foreach (IPAddress ip in Dns.GetHostAddresses(GetClientIP()))
            {
                if (ip.AddressFamily.ToString() == "InterNetwork")
                {
                    ipv4 = ip.ToString();
                    break;
                }
            }

            if (ipv4 != String.Empty)
            {
                return ipv4;
            }

            // 原代碼使用 Dns.GetHostName 方法取回的是 Server 端資料,非 Client 端。
            // 改爲利用 Dns.GetHostEntry 方法,由獲取的 IPv6 位址反查 DNS 記錄,
            // 再逐一判斷是否屬於 IPv4 協議定,如果是轉換爲 IPv4 地址。
            foreach (IPAddress ip in Dns.GetHostEntry(GetClientIP()).AddressList)
            //foreach (IPAddress ip in Dns.GetHostAddresses(Dns.GetHostName()))
            {
                if (ip.AddressFamily.ToString() == "InterNetwork")
                {
                    ipv4 = ip.ToString();
                    break;
                }
            }

            return ipv4;
        }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章