1.需要  QQWry.Dat IP 地址数据库

2辅助类库

    using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks; namespace Utilities
{
/// <summary>
/// 根据IP地址查询所在地
/// </summary>
public class IPScanerHelper
{
#region 私有成员
private string dataPath;
private string ip;
private string country;
private string local; private long firstStartIp = ;
private long lastStartIp = ;
private FileStream objfs = null;
private long startIp = ;
private long endIp = ;
private int countryFlag = ;
private long endIpOff = ;
private string errMsg = null;
#endregion #region 构造函数
public IPScanerHelper()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
#endregion #region 公共属性
public string DataPath
{
set { dataPath = value; }
}
public string IP
{
set { ip = value; }
}
public string Country
{
get { return country; }
}
public string Local
{
get { return local; }
}
public string ErrMsg
{
get { return errMsg; }
}
#endregion #region 搜索匹配数据
private int QQwry()
{
string pattern = @"(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))";
Regex objRe = new Regex(pattern);
Match objMa = objRe.Match(ip);
if (!objMa.Success)
{
this.errMsg = "IP格式错误";
return ;
} long ip_Int = this.IpToInt(ip);
int nRet = ;
if (ip_Int >= IpToInt("127.0.0.0") && ip_Int <= IpToInt("127.255.255.255"))
{
this.country = "本机内部环回地址";
this.local = "";
nRet = ;
}
else if ((ip_Int >= IpToInt("0.0.0.0") && ip_Int <= IpToInt("2.255.255.255")) || (ip_Int >= IpToInt("64.0.0.0") && ip_Int <= IpToInt("126.255.255.255")) || (ip_Int >= IpToInt("58.0.0.0") && ip_Int <= IpToInt("60.255.255.255")))
{
this.country = "网络保留地址";
this.local = "";
nRet = ;
}
objfs = new FileStream(this.dataPath, FileMode.Open, FileAccess.Read);
try
{
//objfs.Seek(0,SeekOrigin.Begin);
objfs.Position = ;
byte[] buff = new Byte[];
objfs.Read(buff, , );
firstStartIp = buff[] + buff[] * + buff[] * * + buff[] * * * ;
lastStartIp = buff[] * + buff[] * + buff[] * * + buff[] * * * ;
long recordCount = Convert.ToInt64((lastStartIp - firstStartIp) / 7.0);
if (recordCount <= )
{
country = "FileDataError";
objfs.Close();
return ;
}
long rangE = recordCount;
long rangB = ;
long recNO = ;
while (rangB < rangE - )
{
recNO = (rangE + rangB) / ;
this.GetStartIp(recNO);
if (ip_Int == this.startIp)
{
rangB = recNO;
break;
}
if (ip_Int > this.startIp)
rangB = recNO;
else
rangE = recNO;
}
this.GetStartIp(rangB);
this.GetEndIp();
if (this.startIp <= ip_Int && this.endIp >= ip_Int)
{
this.GetCountry();
this.local = this.local.Replace("(我们一定要解放台湾!!!)", "");
}
else
{
nRet = ;
this.country = "未知";
this.local = "";
}
objfs.Close();
return nRet;
}
catch
{
return ;
} }
#endregion #region IP地址转换成Int数据
private long IpToInt(string ip)
{
char[] dot = new char[] { '.' };
string[] ipArr = ip.Split(dot);
if (ipArr.Length == )
ip = ip + ".0";
ipArr = ip.Split(dot); long ip_Int = ;
long p1 = long.Parse(ipArr[]) * * * ;
long p2 = long.Parse(ipArr[]) * * ;
long p3 = long.Parse(ipArr[]) * ;
long p4 = long.Parse(ipArr[]);
ip_Int = p1 + p2 + p3 + p4;
return ip_Int;
}
#endregion #region int转换成IP
private string IntToIP(long ip_Int)
{
long seg1 = (ip_Int & 0xff000000) >> ;
if (seg1 < )
seg1 += 0x100;
long seg2 = (ip_Int & 0x00ff0000) >> ;
if (seg2 < )
seg2 += 0x100;
long seg3 = (ip_Int & 0x0000ff00) >> ;
if (seg3 < )
seg3 += 0x100;
long seg4 = (ip_Int & 0x000000ff);
if (seg4 < )
seg4 += 0x100;
string ip = seg1.ToString() + "." + seg2.ToString() + "." + seg3.ToString() + "." + seg4.ToString(); return ip;
}
#endregion #region 获取起始IP范围
private long GetStartIp(long recNO)
{
long offSet = firstStartIp + recNO * ;
//objfs.Seek(offSet,SeekOrigin.Begin);
objfs.Position = offSet;
byte[] buff = new Byte[];
objfs.Read(buff, , ); endIpOff = Convert.ToInt64(buff[].ToString()) + Convert.ToInt64(buff[].ToString()) * + Convert.ToInt64(buff[].ToString()) * * ;
startIp = Convert.ToInt64(buff[].ToString()) + Convert.ToInt64(buff[].ToString()) * + Convert.ToInt64(buff[].ToString()) * * + Convert.ToInt64(buff[].ToString()) * * * ;
return startIp;
}
#endregion #region 获取结束IP
private long GetEndIp()
{
//objfs.Seek(endIpOff,SeekOrigin.Begin);
objfs.Position = endIpOff;
byte[] buff = new Byte[];
objfs.Read(buff, , );
this.endIp = Convert.ToInt64(buff[].ToString()) + Convert.ToInt64(buff[].ToString()) * + Convert.ToInt64(buff[].ToString()) * * + Convert.ToInt64(buff[].ToString()) * * * ;
this.countryFlag = buff[];
return this.endIp;
}
#endregion #region 获取国家/区域偏移量
private string GetCountry()
{
switch (this.countryFlag)
{
case :
case :
this.country = GetFlagStr(this.endIpOff + );
this.local = ( == this.countryFlag) ? " " : this.GetFlagStr(this.endIpOff + );
break;
default:
this.country = this.GetFlagStr(this.endIpOff + );
this.local = this.GetFlagStr(objfs.Position);
break;
}
return " ";
}
#endregion #region 获取国家/区域字符串
private string GetFlagStr(long offSet)
{
int flag = ;
byte[] buff = new Byte[];
while ( == )
{
//objfs.Seek(offSet,SeekOrigin.Begin);
objfs.Position = offSet;
flag = objfs.ReadByte();
if (flag == || flag == )
{
objfs.Read(buff, , );
if (flag == )
{
this.countryFlag = ;
this.endIpOff = offSet - ;
}
offSet = Convert.ToInt64(buff[].ToString()) + Convert.ToInt64(buff[].ToString()) * + Convert.ToInt64(buff[].ToString()) * * ;
}
else
{
break;
}
}
if (offSet < )
return " ";
objfs.Position = offSet;
return GetStr();
}
#endregion #region GetStr
private string GetStr()
{
byte lowC = ;
byte upC = ;
string str = "";
byte[] buff = new byte[];
while ( == )
{
lowC = (Byte)objfs.ReadByte();
if (lowC == )
break;
if (lowC > )
{
upC = (byte)objfs.ReadByte();
buff[] = lowC;
buff[] = upC;
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("GB2312");
str += enc.GetString(buff);
}
else
{
str += (char)lowC;
}
}
return str;
}
#endregion #region 获取IP地址
public string IPLocation()
{
this.QQwry();
return this.country + this.local;
}
public string IPLocation(string dataPath, string ip)
{
this.dataPath = dataPath;
this.ip = ip;
this.QQwry();
return this.country + this.local;
}
#endregion
}
}

3.测试

 string IPAddress = NetHelper.GetIPAddress();
IPScanerHelper objScan = new IPScanerHelper();
objScan.IP = IPAddress;
objScan.DataPath = Server.MapPath("~/Resource/IPScaner/QQWry.Dat");
string IPAddressName =objScan.IPLocation();

IP 转地址的更多相关文章

  1. TCP/IP协议原理与应用笔记11:TCP/IP中地址与层次关系

    1. 网络中常用的地址: 2. TCP/IP中地址与层次关系 :

  2. IP V4地址分类

    IP V4地址 共分为五类: A类地址范围:1.0.0.1---126.255.255.254 B类地址范围:128.0.0.1---191.255.255.254 C类地址范围:192.0.0.1- ...

  3. php 获取用户的IP、地址、来源

    js方法获取用户的 ip 和 地址 <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> ...

  4. 新浪IP库地址

    新浪IP库地址 http://int.dpool.sina.com.cn/iplookup/iplookup.php

  5. 如何根据Ip获取地址信息--Java----待整理完善!!!

    如何根据Ip获取地址信息--Java----待整理完善!!! QQWry.dat数据写入方法: http://www.cnblogs.com/xumingxiang/archive/2013/02/1 ...

  6. PHP 中根据 IP 获取地址

    这里使用的是淘宝 IP 地址库提供的 API 接口. 淘宝 IP 地址库:http://ip.taobao.com/instructions.html API 文档说明:  使用事例: /** * 调 ...

  7. 使用新浪IP库获取IP详细地址

    使用新浪IP库获取IP详细地址 <?php class Tool{ /** * 获取IP的归属地( 新浪IP库 ) * * @param $ip String IP地址:112.65.102.1 ...

  8. ip2region.jar实现ip转地址

    ip转地址 根据ip地址查询出所在地址. GitHub地址 https://github.com/lionsoul2014/ip2region/ pom坐标 <dependency> &l ...

  9. IP的地址的划分

    IP地址的划分是计算机网络中很重要的一个知识点,曾经考过三级,但是长时间不用就会忘掉,现在重新将IP的地址划分整理一遍. 首先IP地址的编址方法经历了三个阶段:分类的IP地址.子网的划分.构成超网 我 ...

  10. java-通过ip获取地址

    添加maven依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all&l ...

随机推荐

  1. SHell命令总结

    cat  files-to-copy.txt | xargs -i cp {} /tmp

  2. Gap Locks 区间锁

    Gap Locks 区间锁 1. 区间锁不能用于语句锁定记录使用一个唯一索引来搜索一个唯一的记录 2.READ COMMITTED 没有区间锁 区间锁是一个锁在一个在index记录间的区间,或者一个l ...

  3. bzoj2400

    首先xor类的题目一定要逐位考虑,因为位位之间是不相互影响的逐位考虑每个点是0还是1,这就转化成了一个这样一个问题对于每个点可以选择属于S集合(这位是0)或T集合(这位是1)某些的点对(一条边的两端) ...

  4. 3C Tic-tac-toe

    题目大意: 两个选手轮流在 3*3的矩阵上作标记,一个选手总是画一个‘X’, 另一个选手总是画一个‘0’,谁先在水平线上或者垂直线上,或者对角线上,先完成三个点连在一块,谁就赢.画‘×’的选手是第一个 ...

  5. 【模拟】Codeforces 707A Brain's Photos

    题目链接: http://codeforces.com/problemset/problem/707/A 题目大意: 给一张N*M的图,只有六种颜色(如下),只含B,W,G的是黑白图,否则是彩色图.问 ...

  6. UVa11419 SAM I AM(构造最小点覆盖)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27475 [思路] 二分图的最小点覆盖以及构造最小覆盖. 二分图的最 ...

  7. UVAlive2531 The K-League(最大流)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33451 [思路] 最大流. 大体思路是枚举每个队伍,最大流判断是否 ...

  8. openSession和getCurrentSession的比较

    在比较openSession和getCurrentSession这两个方法之前,我们先认识一下这两个方法. 在进行配置信息管理时,我们一般进行一下简单步骤: Configuration cfg = n ...

  9. C++ static(施工中)

    static 变量 头文件中的static会在引用该头文件的cpp中分别生成副本 //H.h #ifndef _H_H_ #define _H_H_ ; #endif //Ex_2.c #includ ...

  10. 大数据分析神兽麒麟(Apache Kylin)

    1.Apache Kylin是什么? 在现在的大数据时代,越来越多的企业开始使用Hadoop管理数据,但是现有的业务分析工具(如Tableau,Microstrategy等)往往存在很大的局限,如难以 ...