[VB. NET] queries IP addresses through the IPIP. NET database, vb.netipip.net

Source: Internet
Author: User

[VB. NET] queries IP addresses through the IPIP. NET database, vb.netipip.net

The last time I introduced how to Query IP address details using a pure database.
However, pure databases are provided by feedback from netizens, and many data descriptions are not accurate. Therefore, I went online to find some other IP database and finally found the IP database provided by ipip.net.

The IP address provides two versions of the database: paid and free. We can directly use the free version.
Https://www.ipip.net/download.html (you need to register an account first)
The compressed package contains a PHP parsing class, And a 17monipdb. dat file is the database. We only need to use it.

Copy 17monipdb. dat to the main directory of the program and use the following code:

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

This code is translated from the official C # version, and some redundant code is removed, leaving only core functions.
No tests have been conducted. If you have any bugs, please submit them to me.

 

The usage is simple:

Dim ret = IPIP. Find ("127.0.0.1") 'Use line breaks to separate all information. Dim ipdesc = String. Join (vbCrLf, ret)

 

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

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.