如何通过ASP获取IPv4的地址?
时间:2007-04-06
来源:互联网
今天在IIS7.0下配置了ASP调试环境,本以为不会再有什么毛病,现在到好,又出来一个,就是关于获取IP的问题!
先看代码:
Request.ServerVariables( "REMOTE_ADDR ")
这段代码可以获取客户机IP是绝对不会错的,问题就是获取哪一个版本的IP地址!
我现在在用的系统是Vista,在IIS7.0当配置完ASP调试环境后我开始测试!
在用户登陆时,原(其它系统环境下)Request.ServerVariables( "REMOTE_ADDR ")这段代码是可以获取用户IPv4版的地址,而且在接下去的代码中还有一个根据这IP读取数据库中的所在地的功能,但现在用Request.ServerVariables( "REMOTE_ADDR ")这段代码获取的是IPv6版的地址:fe80::c104:94b4:3754:e775%8。
程序在接着进行赋值时提示了错误!然后我就去看是哪里错了,按原来的设想,IPv4版的最多就15个字符如:202.104.120.221这样子,所以数据库里该字段的长度也只设置了15。而现在获取的是IPv6版的地址,所以长度就超出了范围而导致错误!
我不知道我的网络连接设置是不是跟Request.ServerVariables( "REMOTE_ADDR ")这句最终获取IPv6版地址有关,且先贴出来。
网络连接详细信息:
==================================================================
属 性 值
连接特定DNS后缀 domain
描述 网卡型号
实际地址 网卡物理地址
已经启用DHCP 是
IPv4 IP地址 192.168.1.109
IPv4 IP子网掩码 255.255.255.0
获得租约的时间 XXXX年XX月XX日 XX:XX:XX
租约过期的时间 XXXX年XX月XX日 XX:XX:XX
IPv4 默认网站 192.168.1.1
IPv4 DHCP服务器 192.168.1.1
IPv4 DNS服务器 202.96.104.26
192.168.1.1
202.96.104.17
IPv4 WINS服务器
TCPIP 上的NetBIOS已启用 是
连接-本地 IPv6 地址 fe80::c104:94b4:3754:e775%8
IPv6 默认网关
IPv6 DNS服务器
========================================================================
以上各项参数均系统自动获取,我并未进行手工设置!
问题:
1、是否有办法用过ASP获取IPv4的地址?
2、如果无法获取IPv4的地址,那么是否可以将IPv6的地址转换成IPv4的地址?
请手人指点迷津!
先看代码:
Request.ServerVariables( "REMOTE_ADDR ")
这段代码可以获取客户机IP是绝对不会错的,问题就是获取哪一个版本的IP地址!
我现在在用的系统是Vista,在IIS7.0当配置完ASP调试环境后我开始测试!
在用户登陆时,原(其它系统环境下)Request.ServerVariables( "REMOTE_ADDR ")这段代码是可以获取用户IPv4版的地址,而且在接下去的代码中还有一个根据这IP读取数据库中的所在地的功能,但现在用Request.ServerVariables( "REMOTE_ADDR ")这段代码获取的是IPv6版的地址:fe80::c104:94b4:3754:e775%8。
程序在接着进行赋值时提示了错误!然后我就去看是哪里错了,按原来的设想,IPv4版的最多就15个字符如:202.104.120.221这样子,所以数据库里该字段的长度也只设置了15。而现在获取的是IPv6版的地址,所以长度就超出了范围而导致错误!
我不知道我的网络连接设置是不是跟Request.ServerVariables( "REMOTE_ADDR ")这句最终获取IPv6版地址有关,且先贴出来。
网络连接详细信息:
==================================================================
属 性 值
连接特定DNS后缀 domain
描述 网卡型号
实际地址 网卡物理地址
已经启用DHCP 是
IPv4 IP地址 192.168.1.109
IPv4 IP子网掩码 255.255.255.0
获得租约的时间 XXXX年XX月XX日 XX:XX:XX
租约过期的时间 XXXX年XX月XX日 XX:XX:XX
IPv4 默认网站 192.168.1.1
IPv4 DHCP服务器 192.168.1.1
IPv4 DNS服务器 202.96.104.26
192.168.1.1
202.96.104.17
IPv4 WINS服务器
TCPIP 上的NetBIOS已启用 是
连接-本地 IPv6 地址 fe80::c104:94b4:3754:e775%8
IPv6 默认网关
IPv6 DNS服务器
========================================================================
以上各项参数均系统自动获取,我并未进行手工设置!
问题:
1、是否有办法用过ASP获取IPv4的地址?
2、如果无法获取IPv4的地址,那么是否可以将IPv6的地址转换成IPv4的地址?
请手人指点迷津!
作者: lonnmey 发布时间: 2007-04-06
用下面这个函数试试:
Function getIP()
Dim strIPAddr
If Request.ServerVariables( "HTTP_X_FORWARDED_FOR ") = " " OR InStr(Request.ServerVariables( "HTTP_X_FORWARDED_FOR "), "unknown ") > 0 Then
strIPAddr = Request.ServerVariables( "REMOTE_ADDR ")
ElseIf InStr(Request.ServerVariables( "HTTP_X_FORWARDED_FOR "), ", ") > 0 Then
strIPAddr = Mid(Request.ServerVariables( "HTTP_X_FORWARDED_FOR "), 1, InStr(Request.ServerVariables( "HTTP_X_FORWARDED_FOR "), ", ")-1)
ElseIf InStr(Request.ServerVariables( "HTTP_X_FORWARDED_FOR "), "; ") > 0 Then
strIPAddr = Mid(Request.ServerVariables( "HTTP_X_FORWARDED_FOR "), 1, InStr(Request.ServerVariables( "HTTP_X_FORWARDED_FOR "), "; ")-1)
Else
strIPAddr = Request.ServerVariables( "HTTP_X_FORWARDED_FOR ")
End If
getIP = Trim(Mid(strIPAddr, 1, 30))
End Function
Function getIP()
Dim strIPAddr
If Request.ServerVariables( "HTTP_X_FORWARDED_FOR ") = " " OR InStr(Request.ServerVariables( "HTTP_X_FORWARDED_FOR "), "unknown ") > 0 Then
strIPAddr = Request.ServerVariables( "REMOTE_ADDR ")
ElseIf InStr(Request.ServerVariables( "HTTP_X_FORWARDED_FOR "), ", ") > 0 Then
strIPAddr = Mid(Request.ServerVariables( "HTTP_X_FORWARDED_FOR "), 1, InStr(Request.ServerVariables( "HTTP_X_FORWARDED_FOR "), ", ")-1)
ElseIf InStr(Request.ServerVariables( "HTTP_X_FORWARDED_FOR "), "; ") > 0 Then
strIPAddr = Mid(Request.ServerVariables( "HTTP_X_FORWARDED_FOR "), 1, InStr(Request.ServerVariables( "HTTP_X_FORWARDED_FOR "), "; ")-1)
Else
strIPAddr = Request.ServerVariables( "HTTP_X_FORWARDED_FOR ")
End If
getIP = Trim(Mid(strIPAddr, 1, 30))
End Function
作者: wangwm 发布时间: 2007-04-06
谢谢!我试试,不过上面这段代码还不是那么容易看明白!
呵呵,我先啃去!
谢谢!
呵呵,我先啃去!
谢谢!
作者: lonnmey 发布时间: 2007-04-06
还是不行!上面这段代码我仔细看了一下,似乎只是用于获取真实IP。
而我现在没用代理服务器,所以最终仍然是用
strIPAddr = Request.ServerVariables( "REMOTE_ADDR ")
这句获取IP的,那么结果就相当明显了,
获取的还是IPv6的地址!
高人们呐,能不能再想想办法呀?
而我现在没用代理服务器,所以最终仍然是用
strIPAddr = Request.ServerVariables( "REMOTE_ADDR ")
这句获取IP的,那么结果就相当明显了,
获取的还是IPv6的地址!
高人们呐,能不能再想想办法呀?
作者: lonnmey 发布时间: 2007-04-07
http://blog.csdn.net/superwfei/archive/2008/04/12/2286558.aspx
正在研究 asp 怎么实现。。。
正在研究 asp 怎么实现。。。
作者: superwfei 发布时间: 2008-04-14
using System;
using System.Net;
using System.Web;
namespace Common
{
public class IPNetworking
{
/// <summary>
/// 取得客户端主机 IPv4 位址(由获取的 IPv6 位址反查 DNS 纪录)
/// </summary>
/// <returns></returns>
public static string GetClientIPv4Address()
{
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"];
}
}
}
}
using System.Net;
using System.Web;
namespace Common
{
public class IPNetworking
{
/// <summary>
/// 取得客户端主机 IPv4 位址(由获取的 IPv6 位址反查 DNS 纪录)
/// </summary>
/// <returns></returns>
public static string GetClientIPv4Address()
{
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"];
}
}
}
}
作者: li2012kui 发布时间: 2011-06-18
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28