根据用户IP获取用户的地址。
2007-11-21 16:19
423 查看
public class IPScaner
...{
private string dataPath;//ip数据库地址
private string ip;//ip地址
private string country;//国家
private string local;//本机
private long firstStartIp = 0;//开始ip地址
private long lastStartIp = 0;//最后ip地址
private FileStream objfs = null;//
private long startIp = 0;
private long endIp = 0;
private int countryFlag = 0;
private long endIpOff = 0;
private string errMsg = null;
public IPScaner()
...{
//
// TODO: 在此处添加构造函数逻辑
//
}
/**//// <summary>
/// ip数据库地址
/// </summary>
public string DataPath
...{
set ...{ dataPath = value; }
}
/**//// <summary>
/// ip地址
/// </summary>
public string IP
...{
set ...{ ip = value; }
}
/**//// <summary>
/// 国家
/// </summary>
public string Country
...{
get ...{ return country; }
}
/**//// <summary>
/// 本机
/// </summary>
public string Local
...{
get ...{ return local; }
}
/**//// <summary>
/// 错误信息
/// </summary>
public string ErrMsg
...{
get ...{ return errMsg; }
}
搜索匹配数据#region 搜索匹配数据
private int QQwry()
...{
string pattern = @"(((d{1,2})|(1d{2})|(2[0-4]d)|(25[0-5])).){3}((d{1,2})|(1d{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 4;
}
long ip_Int = this.IpToInt(ip);
int nRet = 0;
if (ip_Int >= IpToInt("127.0.0.0") && ip_Int <= IpToInt("127.255.255.255"))
...{
this.country = "本机内部环回地址";
this.local = "";
nRet = 1;
}
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 = 1;
}
objfs = new FileStream(this.dataPath, FileMode.Open, FileAccess.Read);
try
...{
//objfs.Seek(0,SeekOrigin.Begin);
objfs.Position = 0;
byte[] buff = new Byte[8];
objfs.Read(buff, 0, 8);
firstStartIp = buff[0] + buff[1] * 256 + buff[2] * 256 * 256 + buff[3] * 256 * 256 * 256;
lastStartIp = buff[4] * 1 + buff[5] * 256 + buff[6] * 256 * 256 + buff[7] * 256 * 256 * 256;
long recordCount = Convert.ToInt64((lastStartIp - firstStartIp) / 7.0);
if (recordCount <= 1)
...{
country = "FileDataError";
objfs.Close();
return 2;
}
long rangE = recordCount;
long rangB = 0;
long recNO = 0;
while (rangB < rangE - 1)
...{
recNO = (rangE + rangB) / 2;
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 = 3;
this.country = "未知";
this.local = "";
}
objfs.Close();
return nRet;
}
catch
...{
return 1;
}
}
#endregion
IP地址转换成Int数据#region IP地址转换成Int数据
private long IpToInt(string ip)
...{
char[] dot = new char[] ...{ '.' };
string[] ipArr = ip.Split(dot);
if (ipArr.Length == 3)
ip = ip + ".0";
ipArr = ip.Split(dot);
long ip_Int = 0;
long p1 = long.Parse(ipArr[0]) * 256 * 256 * 256;
long p2 = long.Parse(ipArr[1]) * 256 * 256;
long p3 = long.Parse(ipArr[2]) * 256;
long p4 = long.Parse(ipArr[3]);
ip_Int = p1 + p2 + p3 + p4;
return ip_Int;
}
#endregion
int转换成IP#region int转换成IP
private string IntToIP(long ip_Int)
...{
long seg1 = (ip_Int & 0xff000000) >> 24;
if (seg1 < 0)
seg1 += 0x100;
long seg2 = (ip_Int & 0x00ff0000) >> 16;
if (seg2 < 0)
seg2 += 0x100;
long seg3 = (ip_Int & 0x0000ff00) >> 8;
if (seg3 < 0)
seg3 += 0x100;
long seg4 = (ip_Int & 0x000000ff);
if (seg4 < 0)
seg4 += 0x100;
string ip = seg1.ToString() + "." + seg2.ToString() + "." + seg3.ToString() + "." + seg4.ToString();
return ip;
}
#endregion
获取起始IP范围#region 获取起始IP范围
private long GetStartIp(long recNO)
...{
long offSet = firstStartIp + recNO * 7;
//objfs.Seek(offSet,SeekOrigin.Begin);
objfs.Position = offSet;
byte[] buff = new Byte[7];
objfs.Read(buff, 0, 7);
endIpOff = Convert.ToInt64(buff[4].ToString()) + Convert.ToInt64(buff[5].ToString()) * 256 + Convert.ToInt64(buff[6].ToString()) * 256 * 256;
startIp = Convert.ToInt64(buff[0].ToString()) + Convert.ToInt64(buff[1].ToString()) * 256 + Convert.ToInt64(buff[2].ToString()) * 256 * 256 + Convert.ToInt64(buff[3].ToString()) * 256 * 256 * 256;
return startIp;
}
#endregion
获取结束IP#region 获取结束IP
private long GetEndIp()
...{
//objfs.Seek(endIpOff,SeekOrigin.Begin);
objfs.Position = endIpOff;
byte[] buff = new Byte[5];
objfs.Read(buff, 0, 5);
this.endIp = Convert.ToInt64(buff[0].ToString()) + Convert.ToInt64(buff[1].ToString()) * 256 + Convert.ToInt64(buff[2].ToString()) * 256 * 256 + Convert.ToInt64(buff[3].ToString()) * 256 * 256 * 256;
this.countryFlag = buff[4];
return this.endIp;
}
#endregion
获取国家/区域偏移量#region 获取国家/区域偏移量
private string GetCountry()
...{
switch (this.countryFlag)
...{
case 1:
case 2:
this.country = GetFlagStr(this.endIpOff + 4);
this.local = (1 == this.countryFlag) ? " " : this.GetFlagStr(this.endIpOff + 8);
break;
default:
this.country = this.GetFlagStr(this.endIpOff + 4);
this.local = this.GetFlagStr(objfs.Position);
break;
}
return " ";
}
#endregion
获取国家/区域字符串#region 获取国家/区域字符串
private string GetFlagStr(long offSet)
...{
int flag = 0;
byte[] buff = new Byte[3];
while (1 == 1)
...{
//objfs.Seek(offSet,SeekOrigin.Begin);
objfs.Position = offSet;
flag = objfs.ReadByte();
if (flag == 1 || flag == 2)
...{
objfs.Read(buff, 0, 3);
if (flag == 2)
...{
this.countryFlag = 2;
this.endIpOff = offSet - 4;
}
offSet = Convert.ToInt64(buff[0].ToString()) + Convert.ToInt64(buff[1].ToString()) * 256 + Convert.ToInt64(buff[2].ToString()) * 256 * 256;
}
else
...{
break;
}
}
if (offSet < 12)
return " ";
objfs.Position = offSet;
return GetStr();
}
#endregion
GetStr#region GetStr
private string GetStr()
...{
byte lowC = 0;
byte upC = 0;
string str = "";
byte[] buff = new byte[2];
while (1 == 1)
...{
lowC = (Byte)objfs.ReadByte();
if (lowC == 0)
break;
if (lowC > 127)
...{
upC = (byte)objfs.ReadByte();
buff[0] = lowC;
buff[1] = upC;
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("GB2312");
str += enc.GetString(buff);
}
else
...{
str += (char)lowC;
}
}
return str;
}
#endregion
获取IP地址#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;
}
//调用方法
protected void GetIP()
...{
pweb.info.pweb_info pwebinfo = new pweb.info.pweb_info();
string ipaddress = pwebinfo.ClietIp.ToString();
IPScaner objScan = new IPScaner();
string ip = ipaddress;
objScan.DataPath =ConfigurationManager.AppSettings["UpLoadFile"] + "/" + "QQWry.Dat";
objScan.IP = ip;
string addre = objScan.IPLocation();
string err = objScan.ErrMsg;
this.Label1.Text = "您本机IP地址:" + addre;
}
相关文章推荐
- 根据IP获取详细地址,可以用来做用户识别.进入地区站
- 根据ip获取用户地址-百度
- 根据访问用户IP地址自动获取天气预报
- android 根据网络来获取外网ip地址及国家,地区的接口
- 根据IP获取地址
- JSF/JAVA 根据IP获取客户端Mac地址
- java获取远端ip并根据ip得到详细地址信息
- 用纯Java代码根据IP获取windows和linux的MAC物理地址
- 获取用户IP地址,防钓鱼
- 获取用户Ip地址通用方法常见安全隐患(HTTP_X_FORWARDED_FOR)
- 获取用户IP地址及用户名
- php获取用户ip地址及城市名称
- Java根据用户IP查找用户地址信息
- 获取用户IP地址的三个属性的区别[转]
- CI根据IP获取地址
- 获取用户IP地址的三个属性的区别(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
- 获取用户IP地址
- java根据IP获取用户所在地
- 根据ip获取地址
- JSP页面获取用户IP地址