在启用了IPV6的机器上获取客户端ipv4地址 <转载>
2011-11-25 16:09
429 查看
从 Windows Vista 首开默认启用IPV6 的先例,而在 IPv4、IPv6 两者共存的环境下,IPv6 具有较高的优先级,因此获取的 IP 地址就会以 IPv6 格式为主。好在为了解决这问题,不必刻意把 IPv6 关掉。同样的问题是Host 文件里对localhost的解析,默认返回的是ipv6的地址。具体的说明可以看这篇文章Returning an IPv4 Address in an IPv6-Enabled Environment ,文中也有代码,运行起来不符合预期,修正的代码如下:
using System;
using System.Net;
using System.Web;
public class IPNetworking
{
/// <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;
}
/// <summary>
/// 取得客戶端主机地址
/// </summary>
public static string GetClientIP()
{
if (null == HttpContext.Current.Request.ServerVariables["HTTP_VIA"])
{
return HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
else
{
return HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
}
}
}
IPV6取代IPV4是趋势,在没有大规模部署IPV6,以IPV4为主的环境下以上代码可以救急。
using System;
using System.Net;
using System.Web;
public class IPNetworking
{
/// <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;
}
/// <summary>
/// 取得客戶端主机地址
/// </summary>
public static string GetClientIP()
{
if (null == HttpContext.Current.Request.ServerVariables["HTTP_VIA"])
{
return HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
else
{
return HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
}
}
}
IPV6取代IPV4是趋势,在没有大规模部署IPV6,以IPV4为主的环境下以上代码可以救急。
相关文章推荐
- 在启用了IPV6的机器上获取客户端ipv4地址
- 在启用了IPV6的机器上获取客户端ipv4地址
- <转载>利用dns类和WMI规范获取IP及MAC地址
- 潜移默化学会WPF(转载篇<一>)--WPF 遍历DataTemplate(获取所有控件)
- 转载【js中获取 <%=request.getContextPath()%>】
- 转载:老问题再次发生 “从客户端(userName="<hr />")中检测到有潜在危险的 Request.Form 值” 解决方案
- 通过javascript获取<input type="file">的客户端真实路径
- 取得客户端的机器名,域名,登陆用户名...<转>
- jsp页面<input value=<%= %>标签获取数据库值的问题
- 从客户端(ContentPlaceHolder1_ContentPlaceHolder1_FreeTextBox1="sadf <font size="5">as d<...")中检测到有潜在危险的
- .net大型分布式电子商务架构说明(转载来自<头条>)
- 逐步认识C#四种判断相等的方法<转载>
- Java实现从IP和端口列表List<String>获取分离的IP和端口值
- JSP<%= var%>输出脚本+获取cookie的用户名密码
- [转载]Difference between <context:annotation-config> vs <context:component-scan>
- 【转载】typedef函数指针的用法(C++)<经典收藏学习>
- [转载]JQ 选择器大全[<font color=red>强记忆</font>]
- 获取手机信息<uses-permission android:name="android.permission.READ_PHONE_STATE" />
- public abstract interface ????<转载>
- Android获取Manifest中<meta-data>元素工具类