.net 获取远程IP 得到省市

精贴 置顶
1459 0

/******************************************************************
** File Name:IPScanner.cs
** Copyright (c) 2004-2005 PPTech Studio(PPTech.Net)
** Creater:Rexsp(MSN:yubo@x263.net)
** Create Date:2004-12-27 20:10:28
** Modifier:
** Modify Date:
** Description:to scan the ip location from qqwry.dat
** Version: IPScanner 1.0.0
******************************************************************/
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;

  • 没有任何评论
今日天气 ···

···

···

···

热门排行
CSS cursor鼠标样式一览表 2012-06-25
.NET后台写JS代码 2011-11-03
网站地址多出jdfwkey的问题解析及... 2010-08-25
数据库xxx的日志已满,请备份该数... 2013-07-19
百度、google、Yahoo网站地图制作... 2011-01-30
<a>标签的伪类书写顺序问题... 2010-09-04
什么是长尾关键词? 2010-09-24
CEO名言 2010-08-31
Mysql 主从数据库同步 2010-09-12
用ASP实现网页BBS 2010-11-01
博主推荐
本个人博客微信公众平台上线啦~~... 2013-10-13
饼哥网络互联上线啦~~要买域名空... 2013-09-20
网站title标题如何正确修改不会被... 2013-08-26
饼哥通讯录系统上线啦,欢迎大家... 2013-08-24
ASP .NET MYSQL 的简单分页 并不... 2013-08-19
网站有弹窗广告这样的站点,百度... 2013-08-17
做淘宝SEO优化需要注意的8大问题 2013-08-17
淘宝网怎么做SEO优化 2013-08-17
站长们要学习的“苍井空精神” 2013-08-17
苹果公司今日发布了iOS 7第五个开... 2013-08-07
随便看看
Java游戏开发现状分析和走向 2013-06-26
.Net中判断日期时间输入是否合法... 2013-08-22
如何中止一个Java应用或进程? 2013-06-24
如何避免因主机问题给网站优化带... 2013-06-23
js输入框字数限制 2013-06-21
seo自身对于网站降权的处理 2013-06-23
CSS 半透明滤镜在FIREFOX和IE下面... 2010-08-29
关于不带www的域名 2010-09-21
java Enum序列化问题 2013-06-26
本博客手机版上线咯!会员后台也... 2013-07-31
RSS新闻
传媒新闻
CSDN
八卦新闻
女性新闻
台湾新闻
互联网
军事-新浪博客
IT-新浪博客
汽车新闻
游戏新闻
国际新闻
国内新闻
体育新闻
我的微博
北京 上海 杭州 深圳 广州 成都