ホームページ  >  記事  >  バックエンド開発  >  IPIP.NET によるデータベース実装による IP アドレスのクエリの例

IPIP.NET によるデータベース実装による IP アドレスのクエリの例

黄舟
黄舟オリジナル
2017-09-29 14:26:263149ブラウズ

前回は、Innocence Database を使用して IP アドレスの詳細をクエリする方法を紹介しました。
しかし、無罪データベースはネチズンからのフィードバックによって提供されており、多くのデータ記述は正確ではないため、オンラインで他の IP データベースを検索し、最終的に Web サイト ipip.net が提供する IP データベースを見つけました。

IPIPが提供するデータベースには有料と無料の2つのバージョンがあり、無料版を直接使用できます。
ダウンロードアドレス https://www.ipip.net/download.html (最初にアカウントを登録する必要があります)
圧縮パッケージには PHP 解析クラスがあり、17monipdb.dat ファイルもありますデータベースがあるので、それを使用するだけです。

17monipdb.dat をプログラムのメイン ディレクトリにコピーし、次のコードを使用します:

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

このコードは公式 C# バージョンから翻訳され、一部の冗長なコードが削除され、コア機能のみが残されています。
完全にはテストされていません。バグがある場合は私に報告してください。

使い方はとても簡単です:

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

以上がIPIP.NET によるデータベース実装による IP アドレスのクエリの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。