C# .net 如何根据访问者IP获取所在地区

第一步:在根目录添加新项(类),新建一个类文件,把以下文件粘贴到该类文件下:

using System;

using System.Collections.Generic;

using System.Text;

using System.Net;

using System.IO;

using System.Diagnostics;

public class RedirectMode

{

public static readonly int Mode_1 = 1;

public static readonly int Mode_2 = 2;

}

public class IPFormat

{

public static readonly int HeaderLength = 8;

public static readonly int IndexRecLength = 7;

public static readonly int IndexOffset = 3;

public static readonly int RecOffsetLength = 3;

public static readonly string UnknownCountry = "未知的国家";

public static readonly string UnknownZone = "未知的地区";

public static uint ToUint(byte[] val)

{

if (val.Length > 4) throw new ArgumentException();

if (val.Length < 4)

{

byte[] copyBytes = new byte[4];

Array.Copy(val, 0, copyBytes, 0, val.Length);

return BitConverter.ToUInt32(copyBytes, 0);

}

else

{

return BitConverter.ToUInt32(val, 0);

}

}

}

public class IPLocation

{

private IPAddress m_ip;

private string m_country;

private string m_loc;

public IPLocation(IPAddress ip, string country, string loc)

{

m_ip = ip;

m_country = country;

m_loc = loc;

}

public IPAddress IP

{

get { return m_ip; }

}

public string Country

{

get { return m_country; }

}

public string Zone

{

get { return m_loc; }

}

}

/// <summary>

/// This class used to control ip seek

/// </summary>

public class IPSeeker

{

private string m_libPath;

private uint m_indexStart;

private uint m_indexEnd;

public IPSeeker(string libPath)

{

m_libPath = libPath;

//Locate the index block

using (FileStream fs = new FileStream(m_libPath, FileMode.Open, FileAccess.Read))

{

BinaryReader reader = new BinaryReader(fs);

Byte[] header = reader.ReadBytes(IPFormat.HeaderLength);

m_indexStart = BitConverter.ToUInt32(header, 0);

m_indexEnd = BitConverter.ToUInt32(header, 4);

}

}

/// <summary>

/// 输入IP地址,获取IP所在的地区信息

/// </summary>

/// <param name="ip">待查询的IP地址</param>

/// <returns></returns>

public IPLocation GetLocation(IPAddress ip)

{

using (FileStream fs = new FileStream(m_libPath, FileMode.Open, FileAccess.Read))

{

BinaryReader reader = new BinaryReader(fs);

//Because it is network order(BigEndian), so we need to transform it into LittleEndian

Byte[] givenIpBytes = BitConverter.GetBytes(IPAddress.NetworkToHostOrder(BitConverter.ToInt32(ip.GetAddressBytes(), 0)));

uint offset = FindStartPos(fs, reader, m_indexStart, m_indexEnd, givenIpBytes);

return GetIPInfo(fs, reader, offset, ip, givenIpBytes);

}

}

#region private method

private uint FindStartPos(FileStream fs, BinaryReader reader, uint m_indexStart, uint m_indexEnd, byte[] givenIp)

{

uint givenVal = BitConverter.ToUInt32(givenIp, 0);

fs.Position = m_indexStart;

while (fs.Position <= m_indexEnd)

{

Byte[] bytes = reader.ReadBytes(IPFormat.IndexRecLength);

uint curVal = BitConverter.ToUInt32(bytes, 0);

if (curVal > givenVal)

{

fs.Position = fs.Position - 2 * IPFormat.IndexRecLength;

bytes = reader.ReadBytes(IPFormat.IndexRecLength);

byte[] offsetByte = new byte[4];

Array.Copy(bytes, 4, offsetByte, 0, 3);

return BitConverter.ToUInt32(offsetByte, 0);

}

}

return 0;

}

private IPLocation GetIPInfo(FileStream fs, BinaryReader reader, long offset, IPAddress ipToLoc, Byte[] ipBytes)

{

fs.Position = offset;

//To confirm that the given ip is within the range of record IP range

byte[] endIP = reader.ReadBytes(4);

uint endIpVal = BitConverter.ToUInt32(endIP, 0);

uint ipVal = BitConverter.ToUInt32(ipBytes, 0);

if (endIpVal < ipVal) return null;

string country;

string zone;

//Read the Redirection pattern byte

Byte pattern = reader.ReadByte();

if (pattern == RedirectMode.Mode_1)

{

Byte[] countryOffsetBytes = reader.ReadBytes(IPFormat.RecOffsetLength);

uint countryOffset = IPFormat.ToUint(countryOffsetBytes);

if (countryOffset == 0) return GetUnknownLocation(ipToLoc);

fs.Position = countryOffset;

if (fs.ReadByte() == RedirectMode.Mode_2)

{

return ReadMode2Record(fs, reader, ipToLoc);

}

else

{

fs.Position--;

country = ReadString(reader);

zone = ReadZone(fs, reader, Convert.ToUInt32(fs.Position));

}

}

else if (pattern == RedirectMode.Mode_2)

{

return ReadMode2Record(fs, reader, ipToLoc);

}

else

{

fs.Position--;

country = ReadString(reader);

zone = ReadZone(fs, reader, Convert.ToUInt32(fs.Position));

}

return new IPLocation(ipToLoc, country, zone);

}

//When it is in Mode 2

private IPLocation ReadMode2Record(FileStream fs, BinaryReader reader, IPAddress ip)

{

uint countryOffset = IPFormat.ToUint(reader.ReadBytes(IPFormat.RecOffsetLength));

uint curOffset = Convert.ToUInt32(fs.Position);

if (countryOffset == 0) return GetUnknownLocation(ip);

fs.Position = countryOffset;

string country = ReadString(reader);

string zone = ReadZone(fs, reader, curOffset);

return new IPLocation(ip, country, zone);

}

//return a Unknown Location

private IPLocation GetUnknownLocation(IPAddress ip)

{

string country = IPFormat.UnknownCountry;

string zone = IPFormat.UnknownZone;

return new IPLocation(ip, country, zone);

}

//Retrieve the zone info

private string ReadZone(FileStream fs, BinaryReader reader, uint offset)

{

fs.Position = offset;

byte b = reader.ReadByte();

if (b == RedirectMode.Mode_1 || b == RedirectMode.Mode_2)

{

uint zoneOffset = IPFormat.ToUint(reader.ReadBytes(3));

if (zoneOffset == 0) return IPFormat.UnknownZone;

return ReadZone(fs, reader, zoneOffset);

}

else

{

fs.Position--;

return ReadString(reader);

}

}

private string ReadString(BinaryReader reader)

{

List<byte> stringLst = new List<byte>();

byte byteRead = 0;

while ((byteRead = reader.ReadByte()) != 0)

{

stringLst.Add(byteRead);

}

return Encoding.GetEncoding("gb2312").GetString(stringLst.ToArray());

}

#endregion

}

第二步:编写测试文件,Default.aspx.cs中粘贴覆盖以下代码,其中鹅黄色为测试代码;然后F5测试,弹窗说明成功;

using System;

using System.Collections;

using System.Configuration;

using System.Data;

using System.Linq;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.HtmlControls;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Xml.Linq;

public partial class Default2 : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

string ip = Request.ServerVariables.Get("REMOTE_ADDR");//自动获取用户IP

//string ip = TextBox1.Text.Trim();

if (ip == string.Empty) return;

IPSeeker seeker = new IPSeeker(Server.MapPath(@"data/QQWry.Dat"));//纯真IP地址库存放目录!!

System.Net.IPAddress ipaddr = System.Net.IPAddress.Parse(ip);

IPLocation loc = seeker.GetLocation(ipaddr);

if (loc == null)

{

Response.Write("<script>alert(‘指定的IP地址无效!‘)</script>");

}

Response.Write("<script>alert(‘地址:" + loc.Country + loc.Zone + "‘)</script>");

}

}

转自:http://blog.163.com/[email protected]/blog/static/10535715420130551630863/

C# .net 如何根据访问者IP获取所在地区

时间: 2024-10-12 23:07:44

C# .net 如何根据访问者IP获取所在地区的相关文章

php 通过ip获取所在城市地址信息 获取计算机外网ip

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

C# 解析百度天气数据,Rss解析百度新闻以及根据IP获取所在城市

百度天气 接口地址:http://api.map.baidu.com/telematics/v3/weather?location=上海&output=json&ak=hXWAgbsCC9UTkBO5V5Qg1WZ9,其中ak是密钥,自行去申请即可,便于大家测试,楼主就公布并了自己的Key,这样可以直接获取到数据. 获取到的数据是这样的: {"error":0,"status":"success","date"

ip获取所在城市名称等信息接口,及函数

函数: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 function https_request($url,$data = null){     $curl = curl_init();          curl_setopt($cur

获取访问者ip及其所在城市

原本使用新浪Api,然后发现不行了,以下小编重新查找了几个,个人推荐太平洋的接口 1.首先获取真实ip $ip = $_SERVER['REMOTE_ADDR']; 2.要知道的Api接口 几个接口$ip 为上边声明变量 淘宝 : http://ip.taobao.com/service/getIpInfo.php?ip=$ip; 搜狐  :   http://pv.sohu.com/cityjson?ie=utf-8; 太平洋 :   http://whois.pconline.com.cn/

通过GeoIP2分析访问者IP获取地理位置信息

原文链接:http://blog.csdn.net/johnnycode/article/details/42028841 MaxMind GeoIP2 服务能识别互联网用户的地点位置与其他特征,应用广泛,包括个性化定制内容.诈欺检测.广告定向.网站流量分析.执行规定.地理目标定位.地理围栏定位 (geo-fencing)以及数字版权管理.目前使用 GeoIP 更多是配合Nginx或Apache服务器进行日志分析获取网站访问量地域分布状况. GeoIP 分为商业版和免费版,免费版比商业版精度差了

根据访问IP获取所在城市并绑定下拉列表

JS调用 <script type="text/javascript" src="js/jquery.js"></script> <script type="text/javascript" src="js/jquery.cityselect.js"></script> <script type="text/javascript" src="h

读取全球ip获取用户地区

这个 首先说明下.ip库是qq纯真ip库 dat文件类型 public static string QQipPath = AppDomain.CurrentDomain.BaseDirectory + "\\ipdata\\qqwry.dat";///QQ纯真ip库地址 public static string GetCity(string IP) { string ipfilePath = QQipPath; IPSearch ipSearch = new IPSearch(ipfi

根据ip获取对应地区

注意:此方法引用淘宝网提供的接口. import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import javax.servlet.http.HttpServletReques

GPS获取Location 获取所在地点的经纬度

利用手机获取所在地点的经纬度: Location 在Android 开发中还是经常用到的,比如 通过经纬度获取天气,根据Location 获取所在地区详细Address (比如Google Map 开发).等.而在Android 中通过LocationManager 来获取Location .通常获取Location 有GPS 获取,WIFI 获取. 如下介绍GPS获取Location: 第一步: 创建一个Android 工程命名为GPS 第二步: 在MainActivity中利用Locatio