.net 获取远程IP 得到省市

来源:互联网 发布:小世界网络 matlab 编辑:程序博客网 时间:2024/05/21 17:03
using System;using System.IO;using System.Collections;using System.Text;using System.Text.RegularExpressions;public class IPScanner{    #region 私有成员    private string dataPath;    private string ip;    private string country;    private string local;    private long firstStartIp = 0;    private long lastStartIp = 0;    private FileStream objfs = null;    private long startIp = 0;    private long endIp = 0;    private int countryFlag = 0;    private long endIpOff = 0;    private string errMsg = null;    #endregion    #region 构造函数    public IPScanner()    {        //        // 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 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    #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    #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    #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    #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    #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    #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}


 

 调用方法:

string ip = Request.ServerVariables.Get("REMOTE_ADDR");//自动获取用户IP            IPScanner objScan = new IPScanner();            objScan.DataPath = Server.MapPath("~/qqwry.dat");            objScan.IP = ip;            string addre = objScan.IPLocation();            string err = objScan.ErrMsg;
	
				
		
原创粉丝点击