在启用了IPV6的机器上获取客户端ipv4地址
来源:互联网 发布:上海java应届生招聘 编辑:程序博客网 时间:2024/05/16 05:44
从 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为主的环境下以上代码可以救急。
- 在启用了IPV6的机器上获取客户端ipv4地址
- 获取客户端IPv4的地址
- 在centos服务器上启用ipv6地址
- 一个简单的TCP 客户端时间获取程序 ipv4/ipv6
- Ipv6上Ipv4的方法
- 获取本机所有ipv4, ipv6地址
- Android 4.0 获取Ipv4、Ipv6、MAC地址
- Returning an IPv4 Address in an IPv6-Enabled Environment 在vista中获取IPV4的IP
- NAT64下的IPV4地址合成IPV6
- Linux 接口地址的获取-暨获取本地IP地址(所有地址,包括IPv4,IPV6,MAC 地址)
- IPV4、IPV6 地址结构
- IPV4与IPV6地址
- IPv4与IPv6地址
- 如何通过hostname获取已使用IPv6协议的IPv4地址
- .NET MVC获取客户端IPV4地址
- 客户端调用ipv6-test接口得到客户端ipv4与ipv6地址
- IPV4 上搭建 IPV6
- linux下获取本机ip地址,ipv4和ipv6
- Volume 1. Elementary Problem Solving->Volume 2 Big Number 10106 - Product
- VLC命令行参数详解
- myEclipse启动项加载设置
- HTML <thead> 标签
- 自定义select事件
- 在启用了IPV6的机器上获取客户端ipv4地址
- 数据库加载时出错的解决
- VLC 参数
- 智能指针
- TLD算法学习笔记(五)
- 棋盘覆盖JS版本
- oracle 列操作
- 【Android Training - 04】保存数据 [ Lesson 2 - 保存文件]
- linux 命令