Heim >Backend-Entwicklung >C#.Net-Tutorial >Beispiel für die Abfrage von IP-Adressen durch Datenbankimplementierung über IPIP.NET
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" ' 用换行分隔所有信息 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!