怎么匹配IP地址

时间:2022-05-20 09:41:44
我有个IP数据库
有三个字段
[startIP]       [endIP]          [Addr]
58.58.200.1   58.58.205.255    地球中国某省某市

而我要查询的IP是:58.58.203.168
应该界于这[startIP] 和 [endIP] 之间 所以地址也是 地球中国某省某市
但是这是IP 可不是什么整数,怎么匹配?
用什么方法?

18 个解决方案

#1


该回复于2015-05-26 11:26:50被管理员删除

#2


http://topic.csdn.net/u/20080703/14/b43b4edb-ab9f-4d60-a676-04cd76acce59.html

#3


这个就直接用大于小于来判断就好了
  就用
if ip>=rs("startip") and ip<=rs("endip") then
response.write rs("addr")
end if
就好了
  就是一个字符串的比较.

#4


你把库里的IP 全部转成 (IP段1*256*256*256 + IP段1*256*256 + IP段1*256 + IP段4) 的数值


查询的时候也这样计算后就可以比较了.

#5


[img=http://blog.ii-home.cn/diy/sign.asp][/img]
[img=http://blog.ii-home.cn/diy/ip.asp][/img]

#6


引用 4 楼 wcwtitxu 的回复:
你把库里的IP 全部转成 (IP段1*256*256*256 + IP段1*256*256 + IP段1*256 + IP段4) 的数值 


查询的时候也这样计算后就可以比较了.

是不是 IP段1*256*256*256 + IP段2*256*256 + IP段3*256 + IP段4) 的数值   ???

#7




建议采用掩码的形式来匹配,.
    [align=center] = = = =     = = = =
[/align]
.
贴子分数<20:对自已的问题不予重视。
贴子大量未结:对别人的回答不予尊重。
.
 

#8


这样呀。。哦。。哦。。。

#9


引用 6 楼 Anlige 的回复:
是不是 IP段1*256*256*256 + IP段2*256*256 + IP段3*256 + IP段4) 的数值  ??? 


就比如说
58.58.200.1
58.58.205.255
就转成
(58*255*255*255 + 58*255*255 + 200*255 + 1) = 965542201
(58*255*255*255 + 58*255*255 + 205*255 + 255) = 965543730

改造一下数据库,这样存储
[startIP]      [endIP]          [Addr] 
965542201     965543730      地球中国某省某市 
965543731     .....          地球xx国xx省xx市


查询时把 "58.58.203.168" 计算一下,得到 965543133
select addr from yourTABLE where startIP<=965543133 AND endIP>=965543133

#10


才发现,原来上面第一次回复时,写错了....囧

#11


转成数值比较。

#12


引用 9 楼 wcwtitxu 的回复:
引用 6 楼 Anlige 的回复:
是不是 IP段1*256*256*256 + IP段2*256*256 + IP段3*256 + IP段4) 的数值  ??? 
 

就比如说 
58.58.200.1 
58.58.205.255 
就转成 
(58*255*255*255 + 58*255*255 + 200*255 + 1) = 965542201 
(58*255*255*255 + 58*255*255 + 205*255 + 255) = 965543730 

改造一下数据库,这样存储 
[startIP]      [endIP]          [Addr] 
965542201    965543730      地球中国某省某市 
9655…

纯真数据库,动网都是这样的~~呵呵~那天研究动网的ip查询发现的

#13


我用的是
int(ipstr(0))*256*256*256+int(ipstr(1))*256*256+int(ipstr(2))*256+int(ipstr(3))-1

#14


引用 3 楼 wp8888888 的回复:
这个就直接用大于小于来判断就好了 
  就用 
if ip>=rs("startip") and ip <=rs("endip") then 
response.write rs("addr") 
end if 
就好了 
  就是一个字符串的比较.

.
这个真的行吗?两个字符串的比较

#15


字符串比较应该不行吧,因为长度不一样

比如 "9.9.9.9" 比较后就会比 "10.10.10.10" 大, 这显然不正确
如果长度一样 像 "009.009.009.009", "010.010.010.010" 就可以用字符串直接比较

字符串比较 效率会下降很多

还是建议用数字

#16


应该是*256  而不是*255
把它当做(256)进制。
IP这东西,非常有规律:比如 202.203.237.1
它是一个四位数,每位数字不超过255,

#17


恩,256

#18


对.256

#1


该回复于2015-05-26 11:26:50被管理员删除

#2


http://topic.csdn.net/u/20080703/14/b43b4edb-ab9f-4d60-a676-04cd76acce59.html

#3


这个就直接用大于小于来判断就好了
  就用
if ip>=rs("startip") and ip<=rs("endip") then
response.write rs("addr")
end if
就好了
  就是一个字符串的比较.

#4


你把库里的IP 全部转成 (IP段1*256*256*256 + IP段1*256*256 + IP段1*256 + IP段4) 的数值


查询的时候也这样计算后就可以比较了.

#5


[img=http://blog.ii-home.cn/diy/sign.asp][/img]
[img=http://blog.ii-home.cn/diy/ip.asp][/img]

#6


引用 4 楼 wcwtitxu 的回复:
你把库里的IP 全部转成 (IP段1*256*256*256 + IP段1*256*256 + IP段1*256 + IP段4) 的数值 


查询的时候也这样计算后就可以比较了.

是不是 IP段1*256*256*256 + IP段2*256*256 + IP段3*256 + IP段4) 的数值   ???

#7




建议采用掩码的形式来匹配,.
    [align=center] = = = =     = = = =
[/align]
.
贴子分数<20:对自已的问题不予重视。
贴子大量未结:对别人的回答不予尊重。
.
 

#8


这样呀。。哦。。哦。。。

#9


引用 6 楼 Anlige 的回复:
是不是 IP段1*256*256*256 + IP段2*256*256 + IP段3*256 + IP段4) 的数值  ??? 


就比如说
58.58.200.1
58.58.205.255
就转成
(58*255*255*255 + 58*255*255 + 200*255 + 1) = 965542201
(58*255*255*255 + 58*255*255 + 205*255 + 255) = 965543730

改造一下数据库,这样存储
[startIP]      [endIP]          [Addr] 
965542201     965543730      地球中国某省某市 
965543731     .....          地球xx国xx省xx市


查询时把 "58.58.203.168" 计算一下,得到 965543133
select addr from yourTABLE where startIP<=965543133 AND endIP>=965543133

#10


才发现,原来上面第一次回复时,写错了....囧

#11


转成数值比较。

#12


引用 9 楼 wcwtitxu 的回复:
引用 6 楼 Anlige 的回复:
是不是 IP段1*256*256*256 + IP段2*256*256 + IP段3*256 + IP段4) 的数值  ??? 
 

就比如说 
58.58.200.1 
58.58.205.255 
就转成 
(58*255*255*255 + 58*255*255 + 200*255 + 1) = 965542201 
(58*255*255*255 + 58*255*255 + 205*255 + 255) = 965543730 

改造一下数据库,这样存储 
[startIP]      [endIP]          [Addr] 
965542201    965543730      地球中国某省某市 
9655…

纯真数据库,动网都是这样的~~呵呵~那天研究动网的ip查询发现的

#13


我用的是
int(ipstr(0))*256*256*256+int(ipstr(1))*256*256+int(ipstr(2))*256+int(ipstr(3))-1

#14


引用 3 楼 wp8888888 的回复:
这个就直接用大于小于来判断就好了 
  就用 
if ip>=rs("startip") and ip <=rs("endip") then 
response.write rs("addr") 
end if 
就好了 
  就是一个字符串的比较.

.
这个真的行吗?两个字符串的比较

#15


字符串比较应该不行吧,因为长度不一样

比如 "9.9.9.9" 比较后就会比 "10.10.10.10" 大, 这显然不正确
如果长度一样 像 "009.009.009.009", "010.010.010.010" 就可以用字符串直接比较

字符串比较 效率会下降很多

还是建议用数字

#16


应该是*256  而不是*255
把它当做(256)进制。
IP这东西,非常有规律:比如 202.203.237.1
它是一个四位数,每位数字不超过255,

#17


恩,256

#18


对.256