asp.net如何获取【网站用户登录的外网IP和IP所在区域】 asp.net如何获取【网站用户登录的外网IP和IP所在区域】 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 获得 IP HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]获取区域,需要配合一个IP数据库对应查找。因为没有什么规律或者算法可以推算出来。 http://blog.csdn.net/porschev/article/details/6335519可以试试我这个山寨方法。。 private void button5_Click(object sender, EventArgs e) { string[] strs = this.GetUserIpAddr("202.99.96.68") Result: "天津市 联通" } /// <summary> /// 获取客户端的用户地址信息 ydh 2010-9-15 /// </summary> /// <param name="PostIp"></param> /// <returns></returns> private string GetUserPositionNew2010(string PostIp) { try { string url = "http://www.ip.cn/getip.php?action=queryip&ip_url=" + PostIp; System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); req.Method = "GET"; System.Net.HttpWebResponse res = (System.Net.HttpWebResponse)req.GetResponse(); System.IO.StreamReader sr = new System.IO.StreamReader(res.GetResponseStream(), System.Text.Encoding.Default); string backstr = sr.ReadToEnd(); sr.Close(); res.Close(); return backstr; } catch { return ""; } } /// <summary> /// 获取客户端的用户地址信息(具体的地址) /// </summary> /// <param name="IpStr"></param> /// <returns>返回多个查询结果,最多三个。其中第三个的最为准确</returns> public string[] GetUserIpAddr(string IpStr) { try { string end1 = string.Empty; string end2 = string.Empty; string end3 = string.Empty; string strAddrHtml = GetUserPositionNew2010(IpStr);//获取带信息的返回值 int Iposition = strAddrHtml.IndexOf("来自:", 0, strAddrHtml.Length);//截取有用数据 if (Iposition > 0) { int Ilen = "来自:".Length; end1 = strAddrHtml.Substring(Iposition + Ilen); } return new string[] { end1, end1, end1 }; } catch { return new string[] { "", "", "" }; } } 我试了,返回的这句“return "IP:" + ip + " 国家:" + country + " 省市:" + adr;”里面得ip、国际、省市,都是空的 HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]这个就可以。 把你的代码放到服务器上,在本地访问服务器上的,就发现是对的了。。porschev的方法可以,正则需要改下就是这句:string regStr = "(?<=<span id=\"InputIPAddrMessage\">).*?(?=</span>)";要不取到的是本机ip地址的所在地。 CSDN博客的问题引号转义/"转成\" gogogo using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Configuration;using System.IO;using System.Xml;using System.Text.RegularExpressions;using System.Net;using System.Text;public partial class _Default : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { Response.Write(GetIpDetails()); } #region##得到真实IP以及所在地详细信息 /// <summary> /// 得到真实IP以及所在地详细信息(Porschev) /// </summary> /// <returns></returns> public string GetIpDetails() { string url = "http://www.ip138.com/ips8.asp"; //设置获取IP地址和国家源码的网址 string regStr = "(?<=<td\\s*align=\\\"center\\\">)[^<]*?(?=<br/><br/></td>)"; string ipRegStr = "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"; //IP正则 string ip = string.Empty; //IP地址 string country = string.Empty; //国家 string adr = string.Empty; //省市 string html = GetHtml(url); //得到网页源码 Regex reg = new Regex(regStr, RegexOptions.None); Match ma = reg.Match(html); html = ma.Value; Regex ipReg = new Regex(ipRegStr, RegexOptions.None); ma = ipReg.Match(html); ip = ma.Value; //得到IP int index = html.LastIndexOf(":") + 1; country = html.Substring(index); //得到国家 adr = GetAdrByIp(ip); return "IP:" + ip + " 国家:" + country + " 省市:" + adr; } #endregion #region##通过IP得到IP所在地省市 /// <summary> /// 通过IP得到IP所在地省市(Porschev) /// </summary> /// <param name="ip"></param> /// <returns></returns> public string GetAdrByIp(string ip) { string url = "http://www.cz88.net/ip/?ip=" + ip; string regStr = "(?<=<span\\s*id=\\\"cz_addr\\\">).*?(?=</span>)"; string html = GetHtml(url); //得到网页源码 Regex reg = new Regex(regStr, RegexOptions.None); Match ma = reg.Match(html); html = ma.Value; string[] arr = html.Split(' '); return arr[0]; } #endregion #region##获取HTML源码信息 /// <summary> /// 获取HTML源码信息(Porschev) /// </summary> /// <param name="url">获取地址</param> /// <returns>HTML源码</returns> public string GetHtml(string url) { Uri uri = new Uri(url); WebRequest wr = WebRequest.Create(uri); Stream s = wr.GetResponse().GetResponseStream(); StreamReader sr = new StreamReader(s, Encoding.Default); return sr.ReadToEnd(); } #endregion} http://blog.csdn.net/porschev/article/details/6335519博客也重新编辑了一下 回复 porschev 谢谢,你的这个可以用,但是是依赖其他网站的,有没有,另外的方法 不依赖其他网站的 楼主可以到http://www.cz88.net/下载一个纯真IP地址库安装,执行查询程序解压缩成一个文本文件。然后可以用类似下面的程序解析和查询IP地址信息,当然你也可以保存到数据库中查询public class cz88Ip { public uint start; public uint end; public string address; public string company; private static readonly cz88Ip[] Ips; public static cz88Ip get(uint ipv4) { int index = 0; if (Ips.Length != 0) { int average, length = Ips.Length; while (index < length) { if (ipv4 >= Ips[average = (index + length) >> 1].start) index = average + 1; else length = average; } } cz88Ip value = null; if (index != Ips.Length) { value = Ips[index]; if (value.end < ipv4) value = null; } return value; } public static cz88Ip get(string ipv4) { uint ip = parseRange(ipv4); return ip == 0 ? null : get(ip); } public static unsafe uint parseRange(string ipv4) { uint value = 0; if (ipv4 != null && ipv4.Length >= 7 && ipv4.Length <= 15) { fixed (char* ipFixed = ipv4) { int count = 3; uint ipValue = uint.MaxValue; for (char* ip = ipFixed, end = ipFixed + ipv4.Length; ip != end; ++ip) { if (*ip == '.') { if (ipValue > 255) break; else { --count; value <<= 8; value |= ipValue; ipValue = uint.MaxValue; } } else { uint nextValue = (uint)(*ip - '0'); if (nextValue < 10) { if (ipValue == uint.MaxValue) ipValue = nextValue; else { ipValue *= 10; ipValue += nextValue; } } else { ipValue = uint.MaxValue; break; } } } if (ipValue > 255 || count != 0) value = 0; else { value <<= 8; value |= ipValue; } } } return value; } static cz88Ip() { string ipFile = showjim.config.data.cz88Ip.textFile, cz88 = "CZ88.NET"; if (File.Exists(ipFile)) { string[] ips = File.ReadAllLines(ipFile, showjim.sys.pub.gb2312); List<cz88Ip> ipList = new List<cz88Ip>(ips.Length); for (int index = 0, length = ips.Length; index != length; ++index) { string ip = ips[index]; if (ip.Length >= 32) { uint start = parseRange(ip.Substring(0, 16).TrimEnd()); string address = start >= 0xffffff00 ? String.Empty : ip.Substring(32); if (address.EndsWith(cz88)) address = address.Substring(0, address.Length - cz88.Length).Trim(); int addressIndex = address.IndexOf(' '); ipList.Add(new cz88Ip { start = start, end = parseRange(ip.Substring(16, 16).TrimEnd()), address = addressIndex == -1 ? address : address.Substring(0, addressIndex), company = ++addressIndex == 0 || addressIndex == address.Length ? null : address.Substring(addressIndex) }); } else break; } Ips = ipList.ToArray(); } else Ips = new cz88Ip[0]; } } datagridview怎么设置列头对齐,列值对齐 请教水晶报表汇总的问题 Csdn简单问题,纯属送分。 怎样嵌入flash 急急急!!!c#如何让messagebox只弹出一次? 泛型集合里如何使用泛型元素 上传文件,没有权限问题,在线等,急!! 在下拉列表框中输入字母后鼠标消失,怎么解决啊? c# web下我在iis里设置了两个虚拟目录,分别指向不同的文件夹,但是当我运行程序时却运行同一文件夹下的东西。 怎么把自己做好的程序打包啊? c# FastReport动态传值问题 C#如何在文件图标的左下角动态添加一个自定义标志?
获取区域,需要配合一个IP数据库对应查找。因为没有什么规律或者算法可以推算出来。
private void button5_Click(object sender, EventArgs e)
{
string[] strs = this.GetUserIpAddr("202.99.96.68") Result: "天津市 联通"
} /// <summary>
/// 获取客户端的用户地址信息 ydh 2010-9-15
/// </summary>
/// <param name="PostIp"></param>
/// <returns></returns>
private string GetUserPositionNew2010(string PostIp)
{
try
{
string url = "http://www.ip.cn/getip.php?action=queryip&ip_url=" + PostIp;
System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
req.Method = "GET";
System.Net.HttpWebResponse res = (System.Net.HttpWebResponse)req.GetResponse();
System.IO.StreamReader sr = new System.IO.StreamReader(res.GetResponseStream(), System.Text.Encoding.Default);
string backstr = sr.ReadToEnd();
sr.Close();
res.Close();
return backstr;
}
catch
{
return "";
}
} /// <summary>
/// 获取客户端的用户地址信息(具体的地址)
/// </summary>
/// <param name="IpStr"></param>
/// <returns>返回多个查询结果,最多三个。其中第三个的最为准确</returns>
public string[] GetUserIpAddr(string IpStr)
{
try
{
string end1 = string.Empty;
string end2 = string.Empty;
string end3 = string.Empty;
string strAddrHtml = GetUserPositionNew2010(IpStr);//获取带信息的返回值
int Iposition = strAddrHtml.IndexOf("来自:", 0, strAddrHtml.Length);//截取有用数据
if (Iposition > 0)
{
int Ilen = "来自:".Length;
end1 = strAddrHtml.Substring(Iposition + Ilen);
} return new string[] { end1, end1, end1 };
}
catch
{
return new string[] { "", "", "" };
}
}
我试了,返回的这句“return "IP:" + ip + " 国家:" + country + " 省市:" + adr;”
里面得ip、国际、省市,都是空的
porschev的方法可以,正则需要改下
就是这句:string regStr = "(?<=<span id=\"InputIPAddrMessage\">).*?(?=</span>)";
要不取到的是本机ip地址的所在地。
CSDN博客的问题引号转义/"转成\"
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.IO;
using System.Xml;
using System.Text.RegularExpressions;
using System.Net;
using System.Text;public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(GetIpDetails());
} #region##得到真实IP以及所在地详细信息
/// <summary>
/// 得到真实IP以及所在地详细信息(Porschev)
/// </summary>
/// <returns></returns>
public string GetIpDetails()
{
string url = "http://www.ip138.com/ips8.asp"; //设置获取IP地址和国家源码的网址
string regStr = "(?<=<td\\s*align=\\\"center\\\">)[^<]*?(?=<br/><br/></td>)";
string ipRegStr = "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"; //IP正则
string ip = string.Empty; //IP地址
string country = string.Empty; //国家
string adr = string.Empty; //省市
string html = GetHtml(url); //得到网页源码
Regex reg = new Regex(regStr, RegexOptions.None);
Match ma = reg.Match(html); html = ma.Value;
Regex ipReg = new Regex(ipRegStr, RegexOptions.None);
ma = ipReg.Match(html);
ip = ma.Value; //得到IP
int index = html.LastIndexOf(":") + 1;
country = html.Substring(index); //得到国家
adr = GetAdrByIp(ip);
return "IP:" + ip + " 国家:" + country + " 省市:" + adr;
}
#endregion #region##通过IP得到IP所在地省市
/// <summary>
/// 通过IP得到IP所在地省市(Porschev)
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public string GetAdrByIp(string ip)
{
string url = "http://www.cz88.net/ip/?ip=" + ip;
string regStr = "(?<=<span\\s*id=\\\"cz_addr\\\">).*?(?=</span>)";
string html = GetHtml(url); //得到网页源码
Regex reg = new Regex(regStr, RegexOptions.None);
Match ma = reg.Match(html);
html = ma.Value;
string[] arr = html.Split(' ');
return arr[0];
}
#endregion
#region##获取HTML源码信息
/// <summary>
/// 获取HTML源码信息(Porschev)
/// </summary>
/// <param name="url">获取地址</param>
/// <returns>HTML源码</returns>
public string GetHtml(string url)
{
Uri uri = new Uri(url);
WebRequest wr = WebRequest.Create(uri);
Stream s = wr.GetResponse().GetResponseStream();
StreamReader sr = new StreamReader(s, Encoding.Default);
return sr.ReadToEnd();
}
#endregion
}
http://blog.csdn.net/porschev/article/details/6335519博客也重新编辑了一下
porschev 谢谢,你的这个可以用,但是是依赖其他网站的,有没有,另外的方法 不依赖其他网站的
public class cz88Ip
{
public uint start;
public uint end;
public string address;
public string company;
private static readonly cz88Ip[] Ips;
public static cz88Ip get(uint ipv4)
{
int index = 0;
if (Ips.Length != 0)
{
int average, length = Ips.Length;
while (index < length)
{
if (ipv4 >= Ips[average = (index + length) >> 1].start) index = average + 1;
else length = average;
}
}
cz88Ip value = null;
if (index != Ips.Length)
{
value = Ips[index];
if (value.end < ipv4) value = null;
}
return value;
}
public static cz88Ip get(string ipv4)
{
uint ip = parseRange(ipv4);
return ip == 0 ? null : get(ip);
}
public static unsafe uint parseRange(string ipv4)
{
uint value = 0;
if (ipv4 != null && ipv4.Length >= 7 && ipv4.Length <= 15)
{
fixed (char* ipFixed = ipv4)
{
int count = 3;
uint ipValue = uint.MaxValue;
for (char* ip = ipFixed, end = ipFixed + ipv4.Length; ip != end; ++ip)
{
if (*ip == '.')
{
if (ipValue > 255) break;
else
{
--count;
value <<= 8;
value |= ipValue;
ipValue = uint.MaxValue;
}
}
else
{
uint nextValue = (uint)(*ip - '0');
if (nextValue < 10)
{
if (ipValue == uint.MaxValue) ipValue = nextValue;
else
{
ipValue *= 10;
ipValue += nextValue;
}
}
else
{
ipValue = uint.MaxValue;
break;
}
}
}
if (ipValue > 255 || count != 0) value = 0;
else
{
value <<= 8;
value |= ipValue;
}
}
}
return value;
}
static cz88Ip()
{
string ipFile = showjim.config.data.cz88Ip.textFile, cz88 = "CZ88.NET";
if (File.Exists(ipFile))
{
string[] ips = File.ReadAllLines(ipFile, showjim.sys.pub.gb2312);
List<cz88Ip> ipList = new List<cz88Ip>(ips.Length);
for (int index = 0, length = ips.Length; index != length; ++index)
{
string ip = ips[index];
if (ip.Length >= 32)
{
uint start = parseRange(ip.Substring(0, 16).TrimEnd());
string address = start >= 0xffffff00 ? String.Empty : ip.Substring(32);
if (address.EndsWith(cz88)) address = address.Substring(0, address.Length - cz88.Length).Trim();
int addressIndex = address.IndexOf(' ');
ipList.Add(new cz88Ip
{
start = start,
end = parseRange(ip.Substring(16, 16).TrimEnd()),
address = addressIndex == -1 ? address : address.Substring(0, addressIndex),
company = ++addressIndex == 0 || addressIndex == address.Length ? null : address.Substring(addressIndex)
});
}
else break;
}
Ips = ipList.ToArray();
}
else Ips = new cz88Ip[0];
}
}