【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 /****************************** ...
随机推荐
- [Robot Framework] 动态等待,提供默认的等待时间,等待时间可传可不传
默认10s
- SQL0668N 不允许对表"xxx"执行操作,原因码为 "1"
使用db2 load导入30万条记录到某个表,成功后发现表被锁了,并显示: SQL0668N 不允许对表"xxx"执行操作,原因码为 "1" google了一 ...
- ubuntu 配置ftp server(zz)
ubuntu 配置 ftp server 安装vsftpd sudo apt-get install vsftpd # vsftp(Very Secure FTP)是一种在Unix/Linux中非 ...
- scrapy爬取网址,进而爬取详情页问题
1.最容易出现的问题是爬取到的url大多为相对路径,如果直接将爬取到的url进行二次爬取就会出现以下报错: raise ValueError('Missing scheme in request ur ...
- [C#]WinForm动态删除控件 Controls.Remove()
今天遇到一个奇怪的问题,在WinForm内动态添加Button后再动态的移除,发生稀奇古怪的现象,Button控件只被规律的移除,没有完全移除 foreach (Control c in this.C ...
- BP神经网络的参数改进参考?
参考文献:黄巧巧. 基于BP神经网络的手写数字识别系统研究[D].华中师范大学,2009. 47-52 BP神经网络的缺陷:收敛速度慢和局部极小点的问题 使用的改进方案有 1. 学习速率(learn ...
- 2018.11.24 poj2774Long Long Message(后缀数组)
传送门 实际上可以用后缀自动机秒掉 当然后缀数组也挺好写. 我们将两个字符串接在一起,为了方便中间用一个特殊字符连接. 然后对新字符串求heightheightheight数组. 求出来之后对所有满足 ...
- Tomcat架构解析(六)-----BIO、NIO、NIO2、APR
对于应用服务器来说,性能是非常重要的,基本可以说决定着这款应用服务器的未来.通常从软件角度来说,应用服务器性能包括如下几个方面: 1.请求处理的并发程度,当前主流服务器均采用异步的方式处理客户端的请求 ...
- telnet 命令使用方法详解,telnet命令怎么用
telnet 命令使用方法详解,telnet命令怎么用? 文章类型:电脑教程 原创:天诺时空 什么是Telnet? 对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协 ...
- p1 批梯度下降算法
(蓝色字体:批注:绿色背景:需要注意的地方:橙色背景是问题) 一,机器学习分类 二,梯度下降算法:2.1模型 2.2代价函数 2.3 梯度下降算法 一,机器学习分类 无监督学习和监督学习 无监 ...