【VB.NET】利用纯真IP数据库查询IP地址及信息
几年前从某个博客抄来的,已经忘记原地址了,如果需要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地址及信息的更多相关文章
- python3通过纯真IP数据库查询IP归属地信息
在网上看到的别人写的python2的代码,修改成了python3. 把纯真IP数据库文件qqwry.dat放到czip.py同一目录下. #! /usr/bin/env python # -*- co ...
- 易语言 - 模块 - 子程序 - 纯真IP数据库查询
.版本 .支持库 spec .程序集 程序集1 .子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码 _临时子程序 () ' 在初始化代码执行完毕后调用测试代码 返回 () ' ...
- 优化读取纯真IP数据库QQWry.dat获取地区信息
改自HeDaode 2007-12-28的代码 将之改为从硬盘读取后文件后,将MemoryStream放到内存中,提高后续查询速度 ///<summary> /// 提供从纯真IP数据库搜 ...
- PHP调用纯真IP数据库返回具体地址
function convertip($ip) { $ip1num = 0; $ip2num = 0; $ipAddr1 =""; $ipAddr2 =""; ...
- python 利用淘宝IP库 查询IP归属地
#coding:utf-8 from django.test import TestCase import json import urllib ip = "114.114.114.114& ...
- 利用反射把数据库查询到的数据转换成Model、List(改良版)
之前也写过一篇这样的博文,但是非常的粗糙. 博文地址 后来看到了一位前辈(@勤快的小熊)对我的博文的评论后,让我看到了更加优雅的实现方式,于是重构了之前的代码. public static Li ...
- 【VB.NET】通过 IPIP.NET 数据库来查询IP地址
上一次介绍了利用纯真数据库查询IP地址详细信息的方法.然而纯真数据库是由网友反馈所提供的,很多数据描述并不准确,所以我上网找了一些其他的IP数据库,最后就找到了 ipip.net 这个网站所提供的IP ...
- C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法【转】
前言 C# 用IP地址(123.125.114.144)查询位置(北京市百度公司)的东西,非常好用也非常方便,可手动升级刷新IP库,一次编码永久收益,可支持winform.asp.net等程序. 本文 ...
- [转]C#反射,根据反射将数据库查询数据和实体类绑定,并未实体类赋值
本文来自:http://www.cnblogs.com/mrchenzh/archive/2010/05/31/1747937.html /****************************** ...
随机推荐
- Linux安装及入门
Linux安装及学习 Linux遇到的问题: 在安装过程中因为代码输错(少空格)而质疑自己下载的ubuntu和virtualbox版本,于是卸载之后重新安装了一次,后来才发现是代码输错了(教程中的空格 ...
- jvm gc 算法
1标记-清除法 他是现代垃圾回收算法的思想基础. 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段. 在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象(根搜索算法).而未被标记的对象 ...
- m序列c语言实现
演示,不是算法 void m4() { int a[4]={1,0,0,1}; int m[15]; int temp; for(int i=0;i<15;i++){ m[i] = a[0]; ...
- mybatis 的查询某个字段的特定位数(模糊查询)
获取特定的几位:1.取url字段后三位字符 select SUBSTRING(url, -3) from link; 2.取url字段前三位字符 select SUBSTRING(url, 3) fr ...
- 【Redis】安装及简单使用
Redis介绍 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化 ...
- CSS-表格特有属性和定位
1.表格特有属性 1.边框合并 属性:border-collapse 取值: 1.separate 默认值,即分离边框模式 2.collapse 边框合并 2.边框边距 作用:设置单元格之间或单元格与 ...
- GOAP
市面上Unity人工智能的书籍基本上都是介绍这几个方面: AI角色的自主移动 --- 操控行为, 单体,小队,群体的行为. 我之前的文章 Unity Movement AI (一) , Unity M ...
- understand试用笔记一阅读VS2010项目
一.查看vs2010项目 打开understand,File—New—Project...—Next—Next [向导第三步,选“Import Visual Sudio project files”] ...
- RNN入门
RNN入门学习 原文地址:http://blog.csdn.net/hjimce/article/details/49095371 作者:hjimce 一.相关理论 RNN(Recurrent Neu ...
- IP之ALTIOBUF仿真
这里实现了差分转单端的功能. 问题:差分信号的电平是怎样的?如果像平常一样不设置Pin Planner中的电平的话,编译会报错. 在Pin Planner中做了如下设置: `timescale 1 n ...