• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    c#实现根据网络IP显示地理位置功能示例
    用户信息表,是大多数系统都有的。我们也知道,通常都会有类似 注册IP 和 最后登录IP 这两个的字段,来存储用户注册时候的IP地址和最后登录的IP的地址。

    获取这样的地址,在后台显示 xxx.xxx.xxx.xxx 的地址段,让人看到很不自然,根本就不知道具体地理位置。

    现在我们就简单的实现一下这个功能。
    用到了读取纯真IP数据库的公用组件QQWry.NET 这个组件,作者阿不。(谢谢他的共享)
    还要去下载最新的纯真IP地址库,下载获得QQWry.dat
    最后请出Js中的小靓妞,jquery-1.3.1.js
    新建Web项目AjaxIP,将QQWry.dat添加到App_Data下。
    然后添加QQWry.NET的组件类,如下:
    复制代码 代码如下:

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Text.RegularExpressions;
    using System.Net;
    using System.Net.Sockets;
    namespace AjaxIP
    {
    public class IPLocation
    {
    public string IP { get; set; }
    public string Country { get; set; }
    public string Local { get; set; }
    }
    public class QQWryLocator
    {
    static Encoding encoding = Encoding.GetEncoding("GB2312");
    private byte[] data;
    int firstStartIpOffset;
    int lastStartIpOffset;
    int ipCount;
    public int Count { get { return ipCount; } }
    public QQWryLocator(string dataPath)
    {
    using (FileStream fs = new FileStream(dataPath, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
    data = new byte[fs.Length];
    fs.Read(data, 0, data.Length);
    }
    firstStartIpOffset = (int)data[0] + (((int)data[1]) 8) + (((int)data[2]) 16) + (((int)data[3]) 24);
    lastStartIpOffset = (int)data[4] + (((int)data[5]) 8) + (((int)data[6]) 16) + (((int)data[7]) 24);
    ipCount = (lastStartIpOffset - firstStartIpOffset) / 7 + 1;
    if (ipCount = 1)
    {
    throw new ArgumentException("ip FileDataError");
    }
    }
    public static uint IpToInt(string ip)
    {
    //string[] strArray = ip.Split('.');
    //return (uint.Parse(strArray[0]) 24) + (uint.Parse(strArray[1]) 16) + (uint.Parse(strArray[2]) 8) + uint.Parse(strArray[0]);
    //return (uint)IPAddress.HostToNetworkOrder((int)(IPAddress.Parse(ip).Address));
    byte[] bytes = IPAddress.Parse(ip).GetAddressBytes();
    return (uint)bytes[3] + (((uint)bytes[2]) 8) + (((uint)bytes[1]) 16) + (((uint)bytes[0]) 24);
    }
    public static string IntToIP(uint ip_Int)
    {
    return new IPAddress(ip_Int).ToString();
    }
    public IPLocation Query(string ip)
    {
    IPAddress address = IPAddress.Parse(ip);
    if (address.AddressFamily != AddressFamily.InterNetwork)
    {
    throw new ArgumentException("不支持非IPV4的地址");
    }
    if (IPAddress.IsLoopback(address))
    {
    return new IPLocation() { IP = ip, Country = "本机内部环回地址", Local = string.Empty };
    }
    uint intIP = (uint)IPAddress.HostToNetworkOrder((int)address.Address);
    //if ((((intIP >= IpToInt("0.0.0.0")) (intIP = IpToInt("2.255.255.255"))) || ((intIP >= IpToInt("64.0.0.0")) (intIP = IpToInt("126.255.255.255")))) ||
    //((intIP >= IpToInt("58.0.0.0")) (intIP = IpToInt("60.255.255.255"))))
    //if (intIP = 50331647 || (intIP >= 1073741824 intIP = 2130706431) || (intIP >= 973078528 intIP = 1023410175))
    //{
    // return new IPLocation() { IP = ip, Country = "网络保留地址", Local = string.Empty };
    //}
    IPLocation ipLocation = new IPLocation() { IP = ip };
    uint right = (uint)ipCount;
    uint left = 0;
    uint middle = 0;
    uint startIp = 0;
    uint endIpOff = 0;
    uint endIp = 0;
    int countryFlag = 0;
    while (left (right - 1))
    {
    middle = (right + left) / 2;
    startIp = GetStartIp(middle, out endIpOff);
    if (intIP == startIp)
    {
    left = middle;
    break;
    }
    if (intIP > startIp)
    {
    left = middle;
    }
    else
    {
    right = middle;
    }
    }
    startIp = GetStartIp(left, out endIpOff);
    endIp = GetEndIp(endIpOff, out countryFlag);
    if ((startIp = intIP) (endIp >= intIP))
    {
    string local;
    ipLocation.Country = GetCountry(endIpOff, countryFlag, out local);
    ipLocation.Local = local;
    }
    else
    {
    ipLocation.Country = "未知";
    ipLocation.Local = string.Empty;
    }
    return ipLocation;
    }
    private uint GetStartIp(uint left, out uint endIpOff)
    {
    int leftOffset = (int)(firstStartIpOffset + (left * 7));
    endIpOff = (uint)data[4 + leftOffset] + (((uint)data[5 + leftOffset]) 8) + (((uint)data[6 + leftOffset]) 16);
    return (uint)data[leftOffset] + (((uint)data[1 + leftOffset]) 8) + (((uint)data[2 + leftOffset]) 16) + (((uint)data[3 + leftOffset]) 24);
    }
    private uint GetEndIp(uint endIpOff, out int countryFlag)
    {
    countryFlag = data[4 + endIpOff];
    return (uint)data[endIpOff] + (((uint)data[1 + endIpOff]) 8) + (((uint)data[2 + endIpOff]) 16) + (((uint)data[3 + endIpOff]) 24);
    }
    /// summary>
    /// Gets the country.
    /// /summary>
    /// param name="endIpOff">The end ip off./param>
    /// param name="countryFlag">The country flag./param>
    /// param name="local">The local./param>
    /// returns>country/returns>
    private string GetCountry(uint endIpOff, int countryFlag, out string local)
    {
    string country = string.Empty;
    uint offset = endIpOff + 4;
    switch (countryFlag)
    {
    case 1:
    case 2:
    country = GetFlagStr(ref offset, ref countryFlag, ref endIpOff);
    offset = endIpOff + 8;
    local = (1 == countryFlag) ? string.Empty : GetFlagStr(ref offset, ref countryFlag, ref endIpOff);
    break;
    default:
    country = GetFlagStr(ref offset, ref countryFlag, ref endIpOff);
    local = GetFlagStr(ref offset, ref countryFlag, ref endIpOff);
    break;
    }
    return country;
    }
    private string GetFlagStr(ref uint offset, ref int countryFlag, ref uint endIpOff)
    {
    int flag = 0;
    while (true)
    {
    flag = data[offset];
    //没有重定向
    if (flag != 1 flag != 2)
    {
    break;
    }
    if (flag == 2)
    {
    countryFlag = 2;
    endIpOff = offset - 4;
    }
    offset = (uint)data[1 + offset] + (((uint)data[2 + offset]) 8) + (((uint)data[3 + offset]) 16);
    }
    if (offset 12)
    {
    return string.Empty;
    }
    return GetStr(ref offset);
    }
    /// summary>
    /// 读取字符串...
    /// /summary>
    /// param name="offset">/param>
    /// returns>/returns>
    private string GetStr(ref uint offset)
    {
    byte lowByte = 0;
    byte highByte = 0;
    StringBuilder stringBuilder = new StringBuilder(16);
    while (true)
    {
    lowByte = data[offset++];
    if (lowByte == 0)
    {
    return stringBuilder.ToString();
    }
    if (lowByte > 0x7f)
    {
    highByte = data[offset++];
    if (highByte == 0)
    {
    return stringBuilder.ToString();
    }
    stringBuilder.Append(encoding.GetString(new byte[] { lowByte, highByte }));
    }
    else
    {
    stringBuilder.Append((char)lowByte);
    }
    }
    }
    }
    }

    再来新建 IPSearch.ashx 文件,如下:
    复制代码 代码如下:

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 using System;
    using System.Collections;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    using System.Xml.Linq;
    namespace AjaxIP
    {
    /// summary>
    /// IP查询 的摘要说明
    /// /summary>
    public class IPSearch : IHttpHandler
    {
    public void ProcessRequest(HttpContext context)
    {
    context.Response.ContentType = "text/plain";
    string ip = context.Request["ip"];
    string ipFilePath = @"\App_Data\QQWry.dat";
    QQWryLocator QQWry = new QQWryLocator(ipFilePath);
    IPLocation loc = QQWry.Query(ip);
    context.Response.Write(string.Format("{0} {1}",loc.Country,loc.Local));
    }
    public bool IsReusable
    {
    get
    {
    return false;
    }
    }
    }
    }

    最后在Default.aspx页面写下,js和有IP的用户信息,如下:
    复制代码 代码如下:

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    html xmlns="http://www.w3.org/1999/xhtml" >
    head runat="server">
    title>/title>
    script language="javascript" src="Js/jquery-1.3.1.js">/script>
    script language="javascript">
    $(document).ready(function() {
    $("#tb tr").each(function() {
    var obj = $(this).children("td:eq(2)");
    SearchIP(obj);
    });
    })
    function SearchIP(obj) {
    $.ajax({
    type: "GET",
    url: "IPSearch.ashx?ip=" + obj.text(),
    success: function(data) {
    obj.text(data);
    }
    });
    }
    /script>
    /head>
    body>
    form id="form1" runat="server">
    div>
    table id="tb" style="width:100%;">
    thead>
    th>321321/th>
    th>321321/th>
    th>321321/th>
    /thead>
    tr>
    td>
    OMEGA/td>
    td>
    0/td>
    td>
    122.229.191.8/td>
    /tr>
    tr>
    td>
    荒年/td>
    td>
    900,000/td>
    td>
    110.87.98.30/td>
    /tr>
    tr>
    td>
    寒妃/td>
    td>
    1,854,257,979/td>
    td>
    220.188.193.72/td>
    /tr>
    tr>
    td>
    哈小土/td>
    td>
    600,100/td>
    td>
    220.188.193.72/td>
    /tr>
    tr>
    td>
    化妆造型/td>
    td>
    400,100/td>
    td>
    220.188.193.72/td>
    /tr>
    /table>
    /div>
    /form>
    /body>
    /html>

    这样我们的后台用户信息不再是不友好的IP地址段了。
    运行一下,看看效果吧.
    您可能感兴趣的文章:
    • 通过百度地图获取公交线路的站点坐标的js代码
    • 百度地图api应用标注地理位置信息(js版)
    • 如何在一个页面显示多个百度地图
    • 利用百度地图JSAPI生成h7n9禽流感分布图实现代码
    • 用Android Location获取当前地理位置的方法
    • Android下如何使用百度地图sdk
    • JS中引用百度地图并将百度地图的logo和信息去掉
    • java调用百度定位api服务获取地理位置示例
    • c#通过ip获取地理信息
    • ios百度地图的使用(普通定位、反地理编码)
    上一篇:关于中gridview 字符串截取的方法
    下一篇:读取纯真IP数据库的公用组件接口QQWry.NET
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    c#实现根据网络IP显示地理位置功能示例 实现,根据,网络,显示,地理位置,