通过IPIP.NET如何实现数据库查询IP地址-创新互联
小编给大家分享一下通过IPIP.NET如何实现数据库查询IP地址,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

IPIP所提供的数据库有付费和免费两个版本,我们可以直接使用其中的免费版本。
下载地址 https://www.ipip.net/download.html (需要先注册一个帐号)
压缩包内有一个PHP的解析类,还有一个 17monipdb.dat 文件就是数据库了,我们只需要用到它就可以了。
将 17monipdb.dat 复制到程序的主目录,使用下面的代码:
Imports System.IO
Imports System.Text
Public Class IPIP
Shared offset As Integer
Shared index As UInteger() = New UInteger(255) {}
Shared dataBuffer As Byte()
Shared indexBuffer As Byte()
Shared lastModifyTime As Long = 0L
Shared ipFile As String
Shared rwlock As New Threading.ReaderWriterLock
Shared Sub New()
Load("17monipdb.dat")
End Sub
Shared Sub Load(ByVal filename As String)
ipFile = New FileInfo(filename).FullName
Load()
End Sub
Shared Sub Load()
rwlock.AcquireWriterLock(-1)
Dim fi As New FileInfo(ipFile)
lastModifyTime = fi.LastWriteTime.Ticks
Try
dataBuffer = File.ReadAllBytes(fi.FullName)
Dim indexLength = BytesToLong(dataBuffer(0), dataBuffer(1), dataBuffer(2), dataBuffer(3))
indexBuffer = New Byte(indexLength - 1) {}
Array.Copy(dataBuffer, 4, indexBuffer, 0, indexLength)
offset = CType(indexLength, Integer)
For lp As Integer = 0 To 255
index(lp) = BytesToLong( _
indexBuffer(lp * 4 + 3), _
indexBuffer(lp * 4 + 2), _
indexBuffer(lp * 4 + 1), _
indexBuffer(lp * 4) _
)
Next
Catch ex As Exception
Throw ex
End Try
rwlock.ReleaseWriterLock()
End Sub
Private Shared Function BytesToLong(ByVal a As Byte, ByVal b As Byte, ByVal c As Byte, ByVal d As Byte) As UInteger
Return (CType(a, UInteger) << 24) Or (CType(b, UInteger) << 16) Or (CType(c, UInteger) << 8) Or d
End Function
Shared Function Find(ByVal ip As String) As String()
rwlock.AcquireReaderLock(-1)
Dim ips = ip.Split(".")
Dim ip_prefix_value = Integer.Parse(ips(0))
Dim ip2long_value As Long = BytesToLong(Byte.Parse(ips(0)), Byte.Parse(ips(1)), Byte.Parse(ips(2)), Byte.Parse(ips(3)))
Dim start = index(ip_prefix_value)
Dim max_comp_len = offset - 1028
Dim index_offset As Long = -1L
Dim index_length As Integer = -1
Dim b As Byte = 0
start = start * 8 + 1024
While start < max_comp_len
If BytesToLong(indexBuffer(start + 0), indexBuffer(start + 1), indexBuffer(start + 2), indexBuffer(start + 3)) >= ip2long_value Then
index_offset = BytesToLong(b, indexBuffer(start + 6), indexBuffer(start + 5), indexBuffer(start + 4))
index_length = &HFF And indexBuffer(start + 7)
Exit While
End If
start += 8
End While
Dim areaBytes = New Byte(index_length - 1) {}
Array.Copy(dataBuffer, offset + index_offset - 1024, areaBytes, 0, index_length)
Dim ret As String() = Encoding.UTF8.GetString(areaBytes).Split(vbTab)
rwlock.ReleaseReaderLock()
Return ret
End Function
End Class此代码是我从官方提供的C#版本翻译过来的,并且去除了一些冗余代码,只留下核心功能。
未经过完全的测试,有BUG请反馈给我。
使用方法很简单:
Dim ret = IPIP.Find("127.0.0.1"
' 用换行分隔所有信息
Dim ipdesc = String.Join(vbCrLf, ret)以上是通过IPIP.NET如何实现数据库查询IP地址的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联成都网站设计公司行业资讯频道!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章名称:通过IPIP.NET如何实现数据库查询IP地址-创新互联
浏览路径:http://www.jxjierui.cn/article/ijode.html


咨询
建站咨询
