+ -
当前位置:首页 → 问答吧 → 如何通过ASP获取IPv4的地址?

如何通过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的地址?

请手人指点迷津!

作者: 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

作者: wangwm   发布时间: 2007-04-06

谢谢!我试试,不过上面这段代码还不是那么容易看明白!
呵呵,我先啃去!
谢谢!

作者: lonnmey   发布时间: 2007-04-06

还是不行!上面这段代码我仔细看了一下,似乎只是用于获取真实IP。
而我现在没用代理服务器,所以最终仍然是用
strIPAddr   =   Request.ServerVariables( "REMOTE_ADDR ")  
这句获取IP的,那么结果就相当明显了,
获取的还是IPv6的地址!

高人们呐,能不能再想想办法呀?

作者: lonnmey   发布时间: 2007-04-07

http://blog.csdn.net/superwfei/archive/2008/04/12/2286558.aspx

正在研究 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"];
  }
  }
  }
}

作者: li2012kui   发布时间: 2011-06-18