Maison > Article > développement back-end > Exemple d'interrogation d'adresses IP via la mise en œuvre d'une base de données via IPIP.NET
La dernière fois, nous avons présenté la méthode d'utilisation de la base de données Innocence pour interroger les détails de l'adresse IP.
Cependant, la base de données sur l'innocence est fournie par les commentaires des internautes, et de nombreuses descriptions de données ne sont pas exactes, j'ai donc recherché d'autres bases de données IP en ligne et j'ai finalement trouvé la base de données IP fournie par le site Web ipip.net.
La base de données fournie par IPIP a deux versions : payante et gratuite. Nous pouvons directement utiliser la version gratuite.
L'adresse de téléchargement est https://www.ipip.net/download.html (vous devez d'abord créer un compte)
Il y a une classe d'analyse PHP dans le package compressé, et il y a aussi un 17monipdb.dat Le fichier est la base de données, il suffit de l'utiliser.
Copiez 17monipdb.dat dans le répertoire principal du programme et utilisez le code suivant :
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
Ce code a été traduit de la version officielle C# et certaines redondances ont été supprimées. le code, ne laissant que les fonctionnalités de base.
Il n'a pas été entièrement testé. Veuillez me signaler tout bug.
La méthode d'utilisation est très simple :
Dim ret = IPIP.Find("127.0.0.1" ' 用换行分隔所有信息 Dim ipdesc = String.Join(vbCrLf, ret)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!