日期:2014-05-18  浏览次数:20468 次

如何判断一个IP地址在一个IP地址段?
例如
4.43.69.96 ~ 4.208.48.255

有个ip 4.43.69.100 
请问如何判断他在这个IP段中。谢谢!

------解决方案--------------------
好像以前讨论过这个问题....
挖挖坟先~
------解决方案--------------------
探讨
不是这样的
比如下面ip地址段
4.43.69.96 ~ 4.208.48.255

在表中4.43.69.96是一个字段的。4.208.48.255 是另外一个字段的。
我要传入的ip 是4.43.69.100 怎么判断是否在这个ip段中啊?

------解决方案--------------------
探讨
引用:
引用:
不是这样的
比如下面ip地址段
4.43.69.96 ~ 4.208.48.255
在表中4.43.69.96是一个字段的。4.208.48.255 是另外一个字段的。
我要传入的ip 是4.43.69.100 怎么判断是否在这个ip段中啊?
4.43.69.96 ~ 4.208.48.255
这个处理一下,变成这样
4043069096 ~ 4208048255
4.43.69.100 处理成
4043069100
用整数,就好匹配了

用整数可能不严密吧..

------解决方案--------------------
探讨
引用:
不是这样的
比如下面ip地址段
4.43.69.96 ~ 4.208.48.255

在表中4.43.69.96是一个字段的。4.208.48.255 是另外一个字段的。
我要传入的ip 是4.43.69.100 怎么判断是否在这个ip段中啊?

4.43.69.96 ~ 4.208.48.255
这个处理一下,变成这样
4043069096 ~ 4208048255

4.43.69.100 处理成
4043069100

用整数,就好匹配了

------解决方案--------------------
最好的办法是转换为数字进行比较。 


另外


124.*.23.1 - 124.*.44.2

这个不是一个ip段,而是n个ip段
------解决方案--------------------
转成 ***.***.***.***格式之后再根据字符串比较即可。

SQL code
 
create function f_checkIP(@IP varchar(20),@IP_ST varchar(20),@IP_ED varchar(20))
returns bit
as
begin
  select @IP  = right('00'+ParseName(@IP,4),3)+'.'+
          right('00'+ParseName(@IP,3),3)+'.'+
          right('00'+ParseName(@IP,2),3)+'.'+
          right('00'+ParseName(@IP,1),3),
    @IP_ST = right('00'+ParseName(@IP_ST,4),3)+'.'+
          right('00'+ParseName(@IP_ST,3),3)+'.'+
          right('00'+ParseName(@IP_ST,2),3)+'.'+
          right('00'+ParseName(@IP_ST,1),3),
    @IP_ED = right('00'+ParseName(@IP_ED,4),3)+'.'+
          right('00'+ParseName(@IP_ED,3),3)+'.'+
          right('00'+ParseName(@IP_ED,2),3)+'.'+
          right('00'+ParseName(@IP_ED,1),3)
         
  if (@IP between @IP_ST and @IP_ED)
    return 1
 
  return 0
end
go


select dbo.f_checkIP('4.208.48.215','4.43.69.96','4.208.48.255')
select dbo.f_checkIP('4.43.69.95'  ,'4.43.69.96','4.208.48.255')


drop function f_checkIP
go

------解决方案--------------------
SQL code
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_IP2Int]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_IP2Int]
GO

--1. 字符串IP地址转换成IP数值函数。
CREATE FUNCTION dbo.f_IP2Int(
@ip char(15)
)RETURNS bigint
AS
BEGIN
    DECLARE @re bigint
    SET @re=0
    SELECT @re=@re+LEFT(@ip,CHARINDEX('.',@ip+'.')-1)*ID
        ,@ip=STUFF(@ip,1,CHARINDEX('.',@ip+'.'),'')
    FROM(
        SELECT ID=CAST(16777216 as bigint)
        UNION ALL SELECT 65536
        UNION ALL SELECT 256