سؤال

حسنا, إنه بعد ظهر اليوم الجمعة ، لقد كان أسبوع طويل حتى نقدر بعض المساعدة!حاليا لدي قائمة من نطاقات IP على النحو التالي:

List<IPRange> ipRanges = new List<IPRange>();

ipRanges.Add(new IPRange { From = "145.36.0.0", To = "145.36.255.255" });
ipRanges.Add(new IPRange { From = "194.183.227.184", To = "194.183.227.191" });
ipRanges.Add(new IPRange { From = "193.131.192.0", To = "193.131.223.255" });

بعد الحصول على IP العميل ، إذا كان يقع في أي مكان بين هذه المجموعات من نطاقات ، فإنها تحتاج إلى إعادة توجيهك إلى مكان آخر.

على سبيل المثال ،

إذا كان شخص ما بزيارة الموقع مع IP 192.168.0.1, أقول الوصول.إذا ما زار مع 145.36.1.0, لن يسمح لهم بدخول لأنه يقع بين النطاق الأول في تلك القائمة.

أنا يمكن تقسيم كل IP من فترة العمل بها حيث تتراوح يبدأ التغيير ثم القيام المقارنة ، ولكن من شأنها أن تكون ثقيلة على الملقم.

أعلم أن الملكية الفكرية هي في الأساس مجرد أرقام عشرية, ولكن لست متأكدا كيف يعمل.

وقد أي شخص يأتي عبر هذا من قبل ؟

هتافات شون.

هل كانت مفيدة؟

المحلول

وتحويل كل عنوان IP <لأ href = "http://techtaxi.blogspot.com/1990/01/c-function-to-convert-ip-address-to-ip.html" يختلط = "noreferrer" > عددهم ، ومن ثم معرفة ما اذا كان عنوان IP المستخدم بين هذه الأرقام.

public double Dot2LongIP(string DottedIP)
{
    int i;
    string [] arrDec;
    double num = 0;
    if (DottedIP == "")
    {
       return 0;
    }
    else
    {
       arrDec = DottedIP.Split('.');
       for(i = arrDec.Length - 1; i >= 0 ; i --)
       {
          num += ((int.Parse(arrDec[i])%256) * Math.Pow(256 ,(3 - i )));
       }
       return num;
    }
}

نصائح أخرى

وأود أن تحويل عناوين IP إلى أرقام 32 بت ومن ثم القيام بسيط => من و<= لتحقق لمعرفة ما اذا كان في النطاق.

وعلى سبيل المثال، 192.168.1.1 -> 192 * 256 ^ 3 + 168 * 256 ^ 2 + 1 * 256 + 1

العمل مع القيم الخاصة بك، 145.36.0.0 -> 2435055616 و145.36.0.0 -> 2435121151. لذا 145.36.200.30 -> 2435106846، وتقع في هذا النطاق، لذلك فمن صالح. لكن 145.35.255.255 -> 2435055615 ليست في نطاق (بالكاد)، لذلك يفشل

وأود أن أكتب صفي IPRange بحيث جالبة / اضعي تحويل داخليا سلسلة IP لعدد:

new IPRange { From = "145.36.0.0", To = "145.36.255.255" }

هل تحدد داخليا:

int from = 145036000000;
int to = 145036255255;

وبعد ذلك إضافة أسلوب .IsInRange (سلسلة الملكية الفكرية) يحول IP الواردة إلى النموذج اسم الباحث ويفعل مقارنة عادي.

public bool IsInRange(string ipStr)
{
    int ip = ConvertIPStringToInt(ipStr);
    return (from <= ip && ip <= to);
}

وبهذه الطريقة لم يكن لديك لتقسيم المتكاملة في نطاق فترات كل وقته محددا.

وللمتعة فقط (وبعض مظاهر اكتمال) - طريقة أخرى واضحة للقيام بذلك هو التأكد من أن عليك دائما استخدام 3 أرقام لكل جزء من عنوان IP عند تخزينها كسلسلة أي 145.36.0.0 يجب أن يكون 145،036. 000.000 - بهذه الطريقة السلاسل سوف تكون قابلة للمقارنة مباشرة

وما هو واضح أقل سيكون لديك فئة عنوان IP واضحة ولفة مجموعة خاصة بك من منطق المقارنة (أفترض بتهور أنه لا يوجد بالفعل شيء من هذا القبيل مدفونة في أعماق إطار .NET. ..)

قرأت عن هذا قبل بضعة أيام.

يمكنك الحصول على نطاقات IP تحويل ومقارنة.

IF exists (SELECT * from dbo.sysobjects 
    WHERE id = object_id(N'[dbo].[IsPrivateIP]') 
    AND OBJECTPROPERTY(id, N'IsScalarFunction') = 1)
DROP FUNCTION [dbo].[IsPrivateIP]
GO


CREATE FUNCTION dbo.IsPrivateIP( @vcIPAddress varchar(15))
/**************************************************************************
DESCRIPTION: Returns Numeric IP if not private, otherwise returns null

PARAMETERS:
        @vcIPAddress    - The string containing a valid IP

RETURNS:    IP converted to bigint or null if a private IP

USAGE:      SELECT dbo.IsPrivateIP( '207.158.26.10')

DEPENDANCIES:    dbo.IPStringToNumber() function    

AUTHOR: Karen Gayda

DATE:   06/11/2003

MODIFICATION HISTORY:
    WHO     DATE        DESCRIPTION
    ---     ----------  ---------------------------------------------------

***************************************************************************/

    RETURNS bigint
AS
BEGIN
    DECLARE @biClassALo bigint ,
        @biClassAHi bigint ,
        @biClassBLo bigint ,
        @biClassBHi bigint ,
        @biClassCLo bigint ,
        @biClassCHi bigint ,
        @biIP       bigint,
        @bTemp      int 

    SET @biClassALo = 167772160
    SET @biClassAHi = 169549375
    SET @biClassBLo = 2885681152
    SET @biClassBHi = 2887778303
    SET @biClassCLo = 3232235520
    SET @biClassCHi = 3232301055


    SET @biIP = dbo.IPStringToNumber(@vcIPAddress)
    IF @biIP BETWEEN @biClassALo AND @biClassAHi OR @biIP BETWEEN @biClassBLo AND @biClassBHi 
        OR @biIP BETWEEN @biClassCLo AND @biClassCHi 
        SET @biIP = NULL

    RETURN @biIP
END
GO

هنا هو IPStringToNumber المهمة التي يحتاج إليها:

IF exists (SELECT * from dbo.sysobjects 
    WHERE id = object_id(N'[dbo].[IPStringToNumber]') 
    AND OBJECTPROPERTY(id, N'IsScalarFunction') = 1)
DROP FUNCTION [dbo].[IPStringToNumber]
GO

CREATE FUNCTION dbo.IPStringToNumber( @vcIPAddress varchar(15))
/**************************************************************************
DESCRIPTION: Returns Numeric IP, otherwise returns null

PARAMETERS:
        @vcIPAddress    - The string containing a valid IP

RETURNS:    IP converted to bigint or null if not a valid IP

USAGE:         SELECT  dbo.IPStringToNumber( '10.255.255.255')



AUTHOR: Karen Gayda

DATE:   06/11/2003

MODIFICATION HISTORY:
    WHO     DATE        DESCRIPTION
    ---     ----------  ---------------------------------------------------

***************************************************************************/

    RETURNS bigint
AS
BEGIN
    DECLARE 
        @biOctetA   bigint,
        @biOctetB   bigint,
        @biOctetC   bigint,
        @biOctetD   bigint,
        @biIP           bigint

    DECLARE @tblArray TABLE 
       (
        OctetID     smallint,       --Array index
        Octet       bigint          --Array element contents
       )

    --split the IP string and insert each octet into a table row
    INSERT INTO @tblArray
    SELECT ElementID, Convert(bigint,Element) FROM dbo.Split(@vcIPAddress, '.')

    --check that there are four octets and that they are within valid ranges
    IF (SELECT COUNT(*) FROM @tblArray WHERE Octet BETWEEN 0 AND 255) = 4
    BEGIN
        SET @biOctetA = (SELECT (Octet * 256 * 256 * 256) FROM @tblArray WHERE OctetID = 1)
        SET @biOctetB = (SELECT (Octet * 256 * 256 ) FROM @tblArray WHERE OctetID = 2)
        SET @biOctetC = (SELECT (Octet * 256 ) FROM @tblArray WHERE OctetID = 3)
        SET @biOctetD = (SELECT (Octet) FROM @tblArray WHERE OctetID = 4)
        SET @biIP = @biOctetA + @biOctetB + @biOctetC + @biOctetD
    END

    RETURN(@biIP)
END

المراجع:

http://www.sqlservercentral.com/scripts/Miscellaneous/31036/

http://www.sqlservercentral.com/Authors/Scripts/kgayda/17134/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top