Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PHP (https://www.clubdelphi.com/foros/forumdisplay.php?f=15)
-   -   IP Dentro de una red (https://www.clubdelphi.com/foros/showthread.php?t=82940)

paquechu 25-04-2013 22:32:27

IP Dentro de una red
 
Hola
Necesito una funcion que haga lo mismo que esta que pongo mas abajo, mi fuerte no son las redes y no tengo ni papa de C.
Alguien puede echar una mano con esto a ver si se puede traducir a delphi o sabe de otra funcion ya desarrollada en delphi que haga lo mismo?
Un saludo y muchas gracias.
Paco.

Código:

/**
 * Devuelve TRUE si la dirección IPv4 dada pertenece a la subred indicada, FALSE si no
 *
 * @param string $str_ip Dirección IP en formato '127.0.0.1'
 * @param string $str_rango Red y máscara en formato '127.0.0.0/8', '127.0.0.0/255.0.0.0' o '127.0.0.1'
 * @return bool
 *
 * @version v2011-08-30
 */
function ip_pertenece_a_red($str_ip, $str_rango){
    // Extraemos la máscara
    list($str_red, $str_mascara) = array_pad(explode('/', $str_rango), 2, NULL);
    if( is_null($str_mascara) ){
        // No se especifica máscara: el rango es una única IP
        $mascara = 0xFFFFFFFF;
    }elseif( (int)$str_mascara==$str_mascara ){
        // La máscara es un entero: es un número de bits
        $mascara = 0xFFFFFFFF << (32 - (int)$str_mascara);
    }else{
        // La máscara está en formato x.x.x.x
        $mascara = ip2long($str_mascara);
    }

    $ip = ip2long($str_ip);
    $red = ip2long($str_red);
    $inf = $red & $mascara;
    $sup = $red | (~$mascara & 0xFFFFFFFF);

    return $ip>=$inf && $ip<=$sup;
}


ecfisa 25-04-2013 22:47:18

Hola paquechu.

Ese código no es C ni C++, es PHP.

Muevo el hilo al foro correspondiente para que los entendidos en dicho lenguaje te puedan responder.

Saludos :)

paquechu 26-04-2013 08:00:46

Muchas gracias ecfisa.

Perdon por el despiste :-)

Saludos.

paquechu 26-04-2013 23:40:43

Bueno, pues voy por aqui, pero no me funciona...

Al llamar a la funcion

Código Delphi [-]
ip_pertenece_a_red('132.18.3.100', '255.255.0.0/16')

Siempre devuelve falso

Por otro lado, la verdad es que no se si el codigo PHP funciona correctamente......

Código Delphi [-]
function ip_pertenece_a_red(str_ip, str_rango:string):bool;
var
  str_red, str_mascara: String;
  mascara, inf, sup, red, ip: LongWord;
  p: integer;
begin
  // Extraer la red y mascara
  p:=pos('/',str_rango);
  if p=0 then
  begin
    str_red:=str_rango;
    str_mascara:='';
  end else if p>=1 then
  begin
    str_red:=copy(str_rango,1,p-1);
    str_mascara:=copy(str_rango,p+1);
  end;

  if str_mascara='' then
     mascara:=$FFFFFFFF
  else if pos('.',str_mascara)=0 then
     mascara := $FFFFFFFF shl (32 - StrToInt(str_mascara))
  else
     mascara := ip2long(str_mascara);

  ip := ip2long(str_ip);
  red := ip2long(str_red);
  inf := red and mascara;
  sup := red or ( (not mascara) and $FFFFFFFF);

  Result := (ip>=inf) and (ip<=sup);
end;


function ip2Long(IP : string) : LongWord;
var
  IPaddr   : array[1..4] of integer;
  temp     : string;
  res      : Longword;
  i        : integer;

begin
  temp := ip;
  temp := temp + '.';
  for i := 1 to 4 do
  begin
    ipaddr[i] := strtoint(copy(temp,1,pos('.',temp) - 1));
    delete(temp,1,pos('.',temp));
  end;
  // Check the IP
  for i := 1 to 4 do
  begin
    try
       inttostr(ipaddr[i]);
    except
       result := 0; //'Invalid IP address.';
       exit;
    end;
  end;

  res := (ipaddr[1] * $FFFFFF) + ipaddr[1] +
           (ipaddr[2] * $FFFF)   + ipaddr[2] +
           (ipaddr[3] * $FF)     + ipaddr[3] +
           (ipaddr[4]);
           //result := IntToStr(res);
           Result:=res;
end;


La franja horaria es GMT +2. Ahora son las 22:01:31.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi