通过IPIP.NET实现数据库来查询IP地址的实例


本文摘自PHP中文网,作者黄舟,侵删。

上一次介绍了利用纯真数据库查询IP地址详细信息的方法。
然而纯真数据库是由网友反馈所提供的,很多数据描述并不准确,所以我上网找了一些其他的IP数据库,最后就找到了 ipip.net 这个网站所提供的IP数据库。

IPIP所提供的数据库有付费和免费两个版本,我们可以直接使用其中的免费版本。
下载地址 https://www.ipip.net/download.html (需要先注册一个帐号)
压缩包内有一个PHP的解析类,还有一个 17monipdb.dat 文件就是数据库了,我们只需要用到它就可以了。

将 17monipdb.dat 复制到程序的主目录,使用下面的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

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#版本翻译过来的,并且去除了一些冗余代码,只留下核心功能。
未经过完全的测试,有BUG请反馈给我。

使用方法很简单:

1

2

3

Dim ret = IPIP.Find("127.0.0.1"

' 用换行分隔所有信息

Dim ipdesc = String.Join(vbCrLf, ret)

以上就是通过IPIP.NET实现数据库来查询IP地址的实例的详细内容!

相关阅读 >>

.net存储pdf、word和excel到数据库的方法详解

通过IPIP.NET实现数据库来查询ip地址的实例

网站性能优化各层面的几个建议

.net连接oracle出现ora-12514错误

关于.net c# sql数据库sqlhelper类实例代码

详解c#把datatable中数据一次插入数据库的示例代码

asp保存二进制图片到access数据库

最新开源dblayer的详细介绍

详解vs2015自带localdb数据库用法实例

ado调用分页查询存储过程的实例讲解_实用技巧

更多相关阅读请进入《IPIP.NET》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...