在启用了IPV6的机器上获取客户端ipv4地址
2011-10-09 22:00
471 查看
从 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地址 <转载>
- 获取客户端IPv4的地址
- C#获取机器信息(IPV4.IPV6.MAC.硬盘信息,机器厂商/型号)
- Linux 接口地址的获取-暨获取本地IP地址(所有地址,包括IPv4,IPV6,MAC 地址)
- Linux 接口地址的获取-暨获取本地IP地址(所有地址,包括IPv4,IPV6,MAC 地址)
- #获取本机IP地址时排除IPv6类型,只返回IPv4地址的方法
- java获取客户端ID地址
- JAVA服务器端获取客户端远程地址,根据IP获取远程地址,各IP地址查询接口比较
- 如何用ASP来获取客户端真实IP的地址_草根编程
- 利用windows内置的控件获取客户端网卡MAC地址
- 备忘----创建套接字进行地址和端口进行网络序转换时使用ipv4和ipv6都通用的函数
- JSF/JAVA 根据IP获取客户端Mac地址
- js上传文件获取客户端地址
- 如何获取客户端的IP与MAC地址
- php/js获取客户端mac地址的实现代码
- 获取机器MAC地址
- 转载 web网站获取客户端mac地址
- 黑马程序员——C语言之机器数真值、原反补码、位运算与变量地址获取及输出原理
- Servlet获取客户端的IP与MAC地址