几年前从某个博客抄来的,已经忘记原地址了,如果需要C#版的,可以在博客园搜到吧。
我因为自己用,所以转换为了VBNET代码,而且也放置了很久,今天无意间翻出来,就分享给大家吧。

首先,先下载 纯真数据库,名称应该是 QQWry.dat 。
之后将数据库文件复制到程序的主目录即可。

Imports System.IO
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Net
Imports System.Net.Sockets

''' <summary>IP地址查询</summary>
Public NotInheritable Class IPQuery

    ''' <summary>IP地址描述</summary>
    Public Structure IPLocation
        Sub New(ByVal i As String, ByVal c As String, ByVal l As String)
            IP = i
            Country = c
            Local = l
        End Sub
        ''' <summary>IP地址</summary>
        Dim IP As String
        ''' <summary>地域\国家\机构</summary>
        Dim Country As String
        ''' <summary>地域描述</summary>
        Dim Local As String

        ''' <summary>返回完整名称</summary>
        Overloads Function ToString() As String
            Return Me.Country & Me.Local
        End Function
        ''' <param name="ls">连接字符</param>
        Overloads Function ToString(ByVal ls As String) As String
            Return Me.Country & ls & Me.Local
        End Function

        ' 强制转换
        Public Shared Widening Operator CType(ByVal o As IPLocation) As String
            Return o.ToString
        End Operator

    End Structure

    Shared encoding As Encoding = encoding.GetEncoding("GB2312")

    Shared ipCount As Integer
    Shared fsinoffiset As Integer
    Shared lsinoffiset As Integer
    Shared data As Byte()
    ' 加强线程访问安全
    Shared rwl As New Threading.ReaderWriterLock

    ''' <summary>刷新IP数据库</summary>
    Shared Sub ReIPData(ByVal dataPath As String)
        rwl.AcquireWriterLock(-) '设置写权限,禁止读权限

        ' 尝试回收内存中的数据库
        If data IsNot Nothing Then
            data = Nothing
            GC.Collect()
        End If
        ' 读取数据
        data = IO.File.ReadAllBytes(dataPath)
        fsinoffiset = )) + ()) << ) + ()) << ) + ()) << )
        lsinoffiset = )) + ()) << ) + ()) << ) + ()) << )
        ipCount = (lsinoffiset - fsinoffiset) /  + 

        rwl.ReleaseWriterLock()

         Then Throw New ApplicationException("提供的IP数据错误!")
    End Sub

    Shared Sub New()
        ' TODO 替换为自己的数据库地址
        ReIPData(Application.StartupPath & "\QQWry.dat")
    End Sub

    ''' <summary>返回数据库中IP纪录总数</summary>
    Shared ReadOnly Property Count() As Integer
        Get
            Return ipCount
        End Get
    End Property

    ''' <summary>查询一组IP地址</summary>
    Shared Function QueryAll(ByVal ParamArray ips As String()) As IPLocation()
         Then Return Nothing

        ) As IPLocation

            ipls(i) = Query(ips(i))
        Next
        Return ipls
    End Function

    ''' <summary>查询IP地址</summary>
    Shared Function Query(ByVal ip As String) As IPLocation

        rwl.AcquireReaderLock(-) '设置读权限

        Dim ads As IPAddress = IPAddress.Parse(ip)
        If ads.AddressFamily <> AddressFamily.InterNetwork Then Throw New ArgumentException("不支持非IPV4协议")
        If IPAddress.IsLoopback(ads) Then
            rwl.ReleaseReaderLock()
            Return New IPLocation(ip, "本机或保留地址", "")
        End If

        'Dim intIp As UInteger = CUInt(IPAddress.HostToNetworkOrder(CInt(ads.Address)))
        Dim intIp As UInteger = m_ip2uint(ads.ToString)

        Dim iplon As IPLocation : iplon.IP = ip

        Dim right As UInteger = ipCount
        Dim left, middle, startIp, endIpOff, endIp As UInteger

        )
            middle = (
            startIp = GetStartIp(middle, endIpOff)
            If intIp = startIp Then
                left = middle
                Exit While
            End If
            If intIp > startIp Then
                left = middle
            Else
                right = middle
            End If
        End While

        startIp = GetStartIp(left, endIpOff)
        endIp = GetEndIp(endIpOff, countryFlag)
        If startIp <= intIp And endIp >= intIp Then
            Dim local As String = ""
            iplon.Country = GetCountry(endIpOff, countryFlag, local)
            If local = " CZ88.NET" Then local = "" '优化 用于去除部分IP地址返回的广告数据
            iplon.Local = local
        Else
            iplon.Country = "未知地区"
            iplon.Local = "" '"火星网友"
        End If

        rwl.ReleaseReaderLock()

        Return iplon
    End Function

    Private Shared Function GetStartIp(ByVal left As UInteger, ByRef endIpOff As UInteger) As UInteger
        ))
        endIpOff = CUInt(data(leftOffset + )) + (CUInt(data(leftOffset + )) << ) + (CUInt(data(leftOffset + )) << )
        )) << ) + (CUInt(data(leftOffset + )) << ) + (CUInt(data(leftOffset + )) << )
    End Function
    Private Shared Function GetEndIp(ByVal endIpOff As UInteger, ByRef countryFlag As Integer) As UInteger
        countryFlag = data(endIpOff + )
        )) << ) + (CUInt(data(endIpOff + )) << ) + (CUInt(data(endIpOff + )) << )
    End Function

    Private Shared Function GetCountry(ByVal endIpOff As UInteger, ByVal countryFlag As Integer, ByRef local As String) As String
        Dim country As String = ""

        Select Case countryFlag
            ,
                country = GetFlagStr(offset, countryFlag, endIpOff)
                offset = endIpOff +
                local = , "", GetFlagStr(offset, countryFlag, endIpOff))
            Case Else
                country = GetFlagStr(offset, countryFlag, endIpOff)
                local = GetFlagStr(offset, countryFlag, endIpOff)
        End Select
        Return country
    End Function

    Private Shared Function GetFlagStr(ByRef offset As UInteger, ByRef countryFlag As Integer, ByRef endIpOff As UInteger) As String

        Do

            flag = data(offset)
              Then Exit Do
             Then
                countryFlag =
                endIpOff = offset -
            End If
            offset = CUInt(data(offset + )) + (CUInt(data(offset + )) << ) + (CUInt(data(offset + )) << )
        Loop
         Then Return ""
        Return GetStr(offset)
    End Function

    Private Shared Function GetStr(ByRef offset As UInteger) As String
        , highByte
        )
        Do
            lowByte = data(offset) : offset +=
             Then Return sb.ToString
            If lowByte > &H7F Then
                highByte = data(offset) : offset +=
                 Then Return sb.ToString
                sb.Append(encoding.GetString(New Byte() {lowByte, highByte}))
            Else
                sb.Append(ChrW(lowByte))
            End If
        Loop
    End Function

    ''' <summary>将ip地址转换为uint</summary>
    Private Shared Function m_ip2uint(ByVal ip As String) As UInteger
        Dim bs As Byte() = IPAddress.Parse(ip).GetAddressBytes
        )) + (CUInt(bs()) << ) + (CUInt(bs()) << ) + (CUInt(bs()) << )
    End Function

End Class

如果你要设置自定义的数据库位置,记得修改 Shared Sub New 这个方法,或者干脆删除它,自己调用 ReIPData 来设置数据库的地址。

使用方法很简单,如下:

Dim iploca = IPQuery.Query("127.0.0.1")
Dim ipdesc = String.Format("IP {0} 的详细地址为: {1} - {2}", iploca.IP, iploca.Country, iploca.Local)

【VB.NET】利用纯真IP数据库查询IP地址及信息的更多相关文章

  1. python3通过纯真IP数据库查询IP归属地信息

    在网上看到的别人写的python2的代码,修改成了python3. 把纯真IP数据库文件qqwry.dat放到czip.py同一目录下. #! /usr/bin/env python # -*- co ...

  2. 易语言 - 模块 - 子程序 - 纯真IP数据库查询

    .版本 .支持库 spec .程序集 程序集1 .子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码 _临时子程序 () ' 在初始化代码执行完毕后调用测试代码 返回 () ' ...

  3. 优化读取纯真IP数据库QQWry.dat获取地区信息

    改自HeDaode 2007-12-28的代码 将之改为从硬盘读取后文件后,将MemoryStream放到内存中,提高后续查询速度 ///<summary> /// 提供从纯真IP数据库搜 ...

  4. PHP调用纯真IP数据库返回具体地址

    function convertip($ip) { $ip1num = 0; $ip2num = 0; $ipAddr1 =""; $ipAddr2 =""; ...

  5. python 利用淘宝IP库 查询IP归属地

    #coding:utf-8 from django.test import TestCase import json import urllib ip = "114.114.114.114& ...

  6. 利用反射把数据库查询到的数据转换成Model、List(改良版)

    之前也写过一篇这样的博文,但是非常的粗糙.    博文地址 后来看到了一位前辈(@勤快的小熊)对我的博文的评论后,让我看到了更加优雅的实现方式,于是重构了之前的代码. public static Li ...

  7. 【VB.NET】通过 IPIP.NET 数据库来查询IP地址

    上一次介绍了利用纯真数据库查询IP地址详细信息的方法.然而纯真数据库是由网友反馈所提供的,很多数据描述并不准确,所以我上网找了一些其他的IP数据库,最后就找到了 ipip.net 这个网站所提供的IP ...

  8. C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法【转】

    前言 C# 用IP地址(123.125.114.144)查询位置(北京市百度公司)的东西,非常好用也非常方便,可手动升级刷新IP库,一次编码永久收益,可支持winform.asp.net等程序. 本文 ...

  9. [转]C#反射,根据反射将数据库查询数据和实体类绑定,并未实体类赋值

    本文来自:http://www.cnblogs.com/mrchenzh/archive/2010/05/31/1747937.html /****************************** ...

随机推荐

  1. c#对dataset和list集合压缩和解压,能提高访问速度

    public class YS { public static byte[] Decompress(byte[] data) { byte[] bData; MemoryStream ms = new ...

  2. 基于centos6.5 hadoop 伪分布式安装

    步骤1:修改IP 地址和主机名: vi /etc/sysconfig/network-scripts/ifcfg-eth0 如果该文件打开为空白文件代表你计算机上的网卡文件不是这个名称“ifcfg-e ...

  3. JDK8集合类源码解析 - HashSet

    HashSet 特点:不允许放入重复元素 查看源码,发现HashSet是基于HashMap来实现的,对HashMap做了一次“封装”. private transient HashMap<E,O ...

  4. 【UI测试】--帮助设施

  5. RHEL6.3下挂载ISO并配置安装软件包(转)

    1.将RHEL6.3的ISO镜像上传至RHEL6.3服务器上 2.挂载ISO镜像 一般将镜像文件挂载到/mnt/XXX下,所以首先创建挂载文件夹: # mkdir /mnt/cdrom 挂载(我将上传 ...

  6. Python中逗号的妙用

    闲着没事打算用Python刷一遍pat,输出过程中遇到了一个这样的问题: 题目1002题目要求 在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格, 但是P ...

  7. Vue + Element UI 实现权限管理系统

    Vue + Element UI 实现权限管理系统 前端篇(一):搭建开发环境 https://www.cnblogs.com/xifengxiaoma/p/9533018.html

  8. SSH三大框架的工作原理

    Hibernate工作原理 原理:1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件2.由hibernate.cfg.xml中的< ...

  9. 微信小程序之跨界面传参

    微信小程序在两个之间传参类似js传递url拼接参数,举个例子来说吧 input自己设置参数 //index.wxml <form bindsubmit="formSubmit" ...

  10. 实现两个sym转一个sym

    CVO输出如果是一个像素并行输出,选择内嵌人插入同步码.如果两个像素并行输出是不能选择内嵌的,只能选择分离的方式.如果把输出的并行数据给VIP并且要求是内嵌,那只能在内部转或者外部转. 这里是实现外部 ...