Heim  >  Artikel  >  Backend-Entwicklung  >  Beispiel für die Abfrage von IP-Adressen durch Datenbankimplementierung über IPIP.NET

Beispiel für die Abfrage von IP-Adressen durch Datenbankimplementierung über IPIP.NET

黄舟
黄舟Original
2017-09-29 14:26:263149Durchsuche

Das letzte Mal haben wir die Methode zur Verwendung der Innocence-Datenbank zum Abfragen von IP-Adressdetails eingeführt.
Die Unschuldsdatenbank basiert jedoch auf dem Feedback von Internetnutzern und viele Datenbeschreibungen sind nicht korrekt. Daher habe ich online nach anderen IP-Datenbanken gesucht und schließlich die IP-Datenbank gefunden, die von der Website ipip.net bereitgestellt wird.

Die von IPIP bereitgestellte Datenbank gibt es in zwei Versionen: kostenpflichtig und kostenlos. Wir können die kostenlose Version direkt verwenden.
Die Download-Adresse lautet https://www.ipip.net/download.html (Sie müssen zuerst ein Konto registrieren)
Das komprimierte Paket enthält eine PHP-Parsing-Klasse und 17monipdb.dat Die Datei ist die Datenbank, wir müssen sie nur verwenden.

Kopieren Sie 17monipdb.dat in das Hauptverzeichnis des Programms und verwenden Sie den folgenden Code:

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

Dieser Code wurde aus der offiziellen C#-Version übersetzt und einige Redundanzen entfernt der Code, so dass nur die Kernfunktionalität übrig bleibt.
Es wurde nicht vollständig getestet. Bitte melden Sie mir etwaige Fehler.

Die Art der Anwendung ist sehr einfach:

Dim ret = IPIP.Find("127.0.0.1"
&#39; 用换行分隔所有信息
Dim ipdesc = String.Join(vbCrLf, ret)

Das obige ist der detaillierte Inhalt vonBeispiel für die Abfrage von IP-Adressen durch Datenbankimplementierung über IPIP.NET. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn