网站建设资讯

NEWS

网站建设资讯

通过IPIP.NET如何实现数据库查询IP地址

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

四川网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站等网站项目制作,到程序开发,运营维护。创新互联2013年开创至今到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联

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地址的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!


网页标题:通过IPIP.NET如何实现数据库查询IP地址
本文来源:http://cdweb.net/article/gocjog.html