前回は、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" ' 用换行分隔所有信息 Dim ipdesc = String.Join(vbCrLf, ret)
以上がIPIP.NET によるデータベース実装による IP アドレスのクエリの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。