通過IPIP.NET實現資料庫來查詢IP地址的執行個體

來源:互聯網
上載者:User
上一次介紹了利用純真資料庫查詢IP地址詳細資料的方法。
然而純真資料庫是由網友反饋所提供的,很多資料描述並不準確,所以我上網找了一些其他的IP資料庫,最後就找到了 ipip.net 這個網站所提供的IP資料庫。

IPIP所提供的資料庫有付費和免費兩個版本,我們可以直接使用其中的免費版本。
下載地址 https://www.ipip.net/download.html (需要先註冊一個帳號)
壓縮包內有一個PHP的解析類,還有一個 17monipdb.dat 檔案就是資料庫了,我們只需要用到它就可以了。

將 17monipdb.dat 複製到程式的主目錄,使用下面的代碼:

Imports System.IOImports System.TextPublic 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)
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.