Avatar billede codebase Praktikant
30. maj 2003 - 23:22 Der er 21 kommentarer og
1 løsning

funktion til udskrift af ip m.m.

Hvordan kan jeg udskrive alle ip numre mellem eks.
20.20.20.20 og 20.20.21.100

Der må ikke udskrives ip nummer som ikke er gyldigt !
( eks. 200.10.20.400 )

Gerne som en funktion, der retunere et array..
any one ?
Avatar billede codebase Praktikant
31. maj 2003 - 00:54 #1
Nå har fundet en løsning selv..
Avatar billede fangel Nybegynder
31. maj 2003 - 11:02 #2
som god ånd skriver man normalt løsningen så andre kan få glæde af den sener hen...

Morten
Avatar billede codebase Praktikant
31. maj 2003 - 11:09 #3
tjaa,
her er det så...
function AddNULL( $l )
{
    while ( strlen($l) != 3 ) $l = "0".$l;
    return $l;
}

function AddIP( $ip1 , $ip2 )
{
    $ip1 = explode(".", $ip1 );
    $ip11 = $ip1[0];
    $ip12 = $ip1[1];
    $ip13 = $ip1[2];
    $ip14 = $ip1[3];
   
    $ip2 = explode(".", $ip2 );
    $ip21 = $ip2[0];
    $ip22 = $ip2[1];
    $ip23 = $ip2[2];
    $ip24 = $ip2[3];
   
    for($i = 1; $i <= 2; $i++)
    {
        //${'ip'.$i} = explode(".", ${'ip'.$i} );
        for($j = 1; $j <= 4; $j++)
        {
            //${'ip'.$i.$j} = ${'ip'.$i.'\['.$j.'\]'};
            while ( strlen(${'ip'.$i.$j}) != 3 ) ${'ip'.$i.$j} = "0".${'ip'.$i.$j};
        }
    }
    $fromIP = AddNULL($ip11).AddNULL($ip12).AddNULL($ip13).AddNULL($ip14);
    $toIP    = AddNULL($ip21).AddNULL($ip22).AddNULL($ip23).AddNULL($ip24);

    while ( $fromIP <= $toIP  )
    {
        $ip[] = round( $ip11 ) . "." . round( $ip12 ) . "." . round( $ip13 ) . "." . round( $ip14 );
       
        if ( $ip14 + 1  < 256 )
        {
            $ip14 = AddNULL( $ip14 + 1 );
        }
        else
        {
            $ip14 = "001";
            if ( $ip13 + 1 < 256 )
            {
                $ip13 = AddNULL( $ip13 + 1 );
            }
        }
        $fromIP = AddNULL($ip11).AddNULL($ip12).AddNULL($ip13).AddNULL($ip14);
    }
    return $ip;
}
Avatar billede fangel Nybegynder
31. maj 2003 - 11:15 #4
OK... må kunne laves kortere...

<?php

$IPs = array();
for($i=0;$i<=255;$i++){
  for($ii=0;$ii<=255;$ii++){
    for($iii=0;$iii<=255;$iii++){
      for($iiii=0;$iiii<=255;$iiii++){
        $IPs[] = $i . "." . $ii . "." . $iii . "." . $iiii;
      }
    }
  }
}

// så indeholder $IPs et array med samtlige IPer...

// testning af disse:

echo "der er " . count($IPS) . " IPer i arrayet...<br><br>Disse er: <br>";

foreach($IPS AS $no=>$ip){
  echo $no . ": " . $ip;
}

?>

Morten
Avatar billede fangel Nybegynder
31. maj 2003 - 11:16 #5
hov, der skal stå $IPs i foreach løkken ;)
Avatar billede fangel Nybegynder
31. maj 2003 - 11:21 #6
de værste fejl rettet + pænere opstilling:

<?php

$IPs = array();
for($i=0;$i<=255;$i++){
  for($ii=0;$ii<=255;$ii++){
    for($iii=0;$iii<=255;$iii++){
      for($iiii=0;$iiii<=255;$iiii++){
        $IPs[] = $i . "." . $ii . "." . $iii . "." . $iiii;
      }
    }
  }
}

// så indeholder $IPs et array med samtlige IPer...

// testning af disse:

echo "der er " . count($IPs) . " IPer i arrayet...\n<br><br>Disse er: <br>\n\n";

foreach($IPs AS $no=>$ip){
  echo $no . ": " . $ip . "<br>\n";
}

?>

men læg mærke til at det script kommer til at tage LANG tid at gennemføre... der er jo pisse mange IPer...

jeg lavede det hvor IPer "kun" kunne være i intervallet 0.0.0.0 - 25.25.25.25, og det er godt ½ mio. IPer...

Morten
Avatar billede codebase Praktikant
31. maj 2003 - 11:23 #7
ideen kan jeg ikke lige se, men kan du evt.
fikse denne lille bug:
jeg har to arrays som hedder ip1 og ip2, de kan explodes via:
${'ip'.$i} = explode(".", ${'ip'.$i} );

nu ville jeg gerne ha' fat i det array via noget ala:
${'ip'.$i.$j} = ${'ip'.$i.'\['.$j.'\]'};

.. men det virker ik!



  for($i = 1; $i <= 2; $i++)
    {
        //${'ip'.$i} = explode(".", ${'ip'.$i} );
        for($j = 1; $j <= 4; $j++)
        {
            //${'ip'.$i.$j} = ${'ip'.$i.'\['.$j.'\]'};
            while ( strlen(${'ip'.$i.$j}) != 3 ) ${'ip'.$i.$j} = "0".${'ip'.$i.$j};
        }
    }
Avatar billede codebase Praktikant
31. maj 2003 - 11:25 #8
prøv lige min funktion med ip1 = "20.20.20.20" og ip2 = "20.20.23.100"

..got it yet ?
Avatar billede fangel Nybegynder
31. maj 2003 - 11:25 #9
et array kan ikke explodes, det kan imploades...

en streng kan explodes...

Morten
Avatar billede codebase Praktikant
31. maj 2003 - 11:27 #10
denne line:
${'ip'.$i} = explode(".", ${'ip'.$i} );

virker fint..

men jeg kan ikke få fat i eks.
$ip1[2] via denne line:
${'ip'.$i.$j} = ${'ip'.$i.'\['.$j.'\]'};
Avatar billede fangel Nybegynder
31. maj 2003 - 11:27 #11
OK... så modder vi den lidt så man kan angive et interval... 2 sek...

Morten
Avatar billede codebase Praktikant
31. maj 2003 - 11:29 #12
.. by the way, læs lige mit spg igen..

jeg skulle jo finde all ip'er mellem 2 ip's.!
Avatar billede fangel Nybegynder
31. maj 2003 - 11:41 #13
havde jeg lige overset... men dette er stadig kortere...

<?php

function GimmeIP($intStart, $intSlut){
  $arr = explode(".", $intStart);

  $IPs = array();
  for($i=$arr[0];$i<=255;$i++){
    for($ii=$arr[1];$ii<=255;$ii++){
      for($iii=$arr[2];$iii<=255;$iii++){
        for($iiii=$arr[3];$iiii<=255;$iiii++){
          $ip = $i . "." . $ii . "." . $iii . "." . $iiii;
          if($ip == $intSlut){
            $break = true;
            break;
          }
          $IPs[] = $ip;
        }
        if($break) break;
      }
      if($break) break;
    }
    if($break) break;
  }
  return $IPs;
}


$IPer = GimmeIP("20.20.10.0","20.20.20.10");

// så indeholder $IPer et array med samtlige IPer mellem 20.20.10.0 og 20.20.20.10

// testning af disse:

echo "der er " . count($IPer) . " IPer i arrayet...\n<br><br>Disse er: <br>\n\n";

foreach($IPer AS $no=>$ip){
  echo $no . ": " . $ip . "<br>\n";
}

?>

Morten
Avatar billede fangel Nybegynder
31. maj 2003 - 11:46 #14
hov, funktionen skal være sådan he:

function GimmeIP($intStart, $intSlut){
  $arr = explode(".", $intStart);

  $IPs = array();
  for($i=$arr[0];$i<=255;$i++){
    for($ii=$arr[1];$ii<=255;$ii++){
      for($iii=$arr[2];$iii<=255;$iii++){
        for($iiii=$arr[3];$iiii<=255;$iiii++){
          $ip = $i . "." . $ii . "." . $iii . "." . $iiii;
          $IPs[] = $ip;
          if($ip == $intSlut){
            $break = true;
            break;
          }
        }
        if($break) break;
      }
      if($break) break;
    }
    if($break) break;
  }
  return $IPs;
}

Morten
Avatar billede codebase Praktikant
31. maj 2003 - 11:48 #15
tjaa,
$IPer = GimmeIP("20.20.10.100","20.20.20.10");

retunere:
Fatal error:  Allowed memory size of 8388608 bytes exhausted (tried to allocate 10 bytes)

det er jo ikke så cool, vel :-)

.. test min funktion, den virker ...
Avatar billede codebase Praktikant
31. maj 2003 - 11:51 #16
.. som du kan se på tidspunket for mit spg og svar, kan du se at jeg har brugt en rum tid på at leget med arrays. problemet er at et array ikke godkender eks 010, det bliver lavet om til 10. Derfor har jeg lavet det om til en string.!

> codeb@se.dk
Avatar billede fangel Nybegynder
31. maj 2003 - 11:55 #17
sådan... den skulle lige fejl-testes lidt...

function GimmeIP($intStart, $intSlut){
  $arr = explode(".", $intStart);

  $IPs = array();
  $break = false;
  for($i=$arr[0];$i<=255;$i++){
    for($ii=$arr[1];$ii<=255;$ii++){
      $arr[1] = 0;
      for($iii=$arr[2];$iii<=255;$iii++){
        $arr[2] = 0;
        for($iiii=$arr[3];$iiii<=255;$iiii++){
          $arr[3] = 0;
          $ip = $i . "." . $ii . "." . $iii . "." . $iiii;
          $IPs[] = $ip;
          if($ip == $intSlut){
            $break = true;
            break;
          }
        }
        if($break) break;
      }
      if($break) break;
    }
    if($break) break;
  }
  return $IPs;
}

Morten
Avatar billede fangel Nybegynder
31. maj 2003 - 11:56 #18
NU hedder IP jo også fx 192.168.0.1... og ikke 192.168.000.001

Morten
Avatar billede codebase Praktikant
31. maj 2003 - 12:03 #19
det ser ud til at din funktion virker nu, jeg bruger jo også denne line til at fjerne det 0 igen.
$ip[] = round( $ip11 ) . "." . round( $ip12 ) . "." . round( $ip13 ) . "." . round( $ip14 );
Avatar billede codebase Praktikant
31. maj 2003 - 12:09 #20
kunne men ikke:
function GimmeIP($intStart, $intSlut){
  $arr = explode(".", $intStart);

  $IPs = array();
  $break = false;
  for($i=$arr[0];$i<=255;$i++){
    for($ii=$arr[1];$ii<=255;$ii++){
      $arr[1] = 0;
      for($iii=$arr[2];$iii<=255;$iii++){
        $arr[2] = 0;
        for($iiii=$arr[3];$iiii<=255;$iiii++){
          $arr[3] = 0;
          $ip = $i . "." . $ii . "." . $iii . "." . $iiii;
          $IPs[] = $ip;
          if($ip == $intSlut){
            return $IPs;
          }
        }
      }
    }
  }
}
Avatar billede codebase Praktikant
31. maj 2003 - 12:20 #21
hent lige lidt points her http://www.eksperten.dk/spm/359084
Avatar billede fangel Nybegynder
31. maj 2003 - 12:39 #22
jo det kunne man, men så vil løkken forsætte, og så vil du have ALT for mange IPer... og et alt for stort RAM forbrug...

Morten
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester