您的位置:首页 > 其它

根据用户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;


}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: