博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转].net 获取远程IP 得到省市
阅读量:5037 次
发布时间:2019-06-12

本文共 6862 字,大约阅读时间需要 22 分钟。

/******************************************************************

** 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;

作者:qq283868910 发表于2011-12-16 14:47:51
阅读:52 评论:0

转载于:https://www.cnblogs.com/SpeakHero/archive/2011/12/16/2431300.html

你可能感兴趣的文章
腾讯QQ内测群新功能:QQ万人群即将袭来!
查看>>
iOS 事件处理机制与图像渲染过程
查看>>
数字是否可以被3和5同时整除,use if and % (21.9.2017)
查看>>
Warsaw University Contest Petrozavodsk, Thursday, January 31, 2008 F题,Gym100096F
查看>>
lcx端口转发 linux版
查看>>
arcgis server 10.1 发布动态图层展示海量及频繁更新的数据步骤
查看>>
strncat_s
查看>>
避免复制引用程序集的XML文件
查看>>
C IO(一般性)
查看>>
机器学习中的贝叶斯方法---先验概率、似然函数、后验概率的理解及如何使用贝叶斯进行模型预测(2)...
查看>>
SQL Server 2005 数据库 可疑状态
查看>>
L1-Day4
查看>>
搭建mocha测试环境并使用selenium进行测试
查看>>
Javascript测试之karma + mocha
查看>>
双城记开头
查看>>
烦人的幻灯片问题
查看>>
最大密度子图
查看>>
基于SSM-EasyUI的权限管理系统
查看>>
观察者模式
查看>>
[CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口
查看>>