Avatar billede bigo Nybegynder
10. november 2004 - 13:51 Der er 11 kommentarer og
1 løsning

erstat sidste oktet med værdi

Hejsa.

Jeg søger en funktion der finder det næste ledige ipnummer udfra et array (som er fyldt med ipnumre i usorteret rækkefølge) men dog inden for samme segment (f.eks. 10.0.0.0/8).

Den sidste oktet må ikke være mindre end 10 og hvis den er større end 254 skal der kigges på den næste oktet. (f.eks. 10.0.1.0/8)

Nogen der har en ide??
Avatar billede hmortensen Nybegynder
10. november 2004 - 17:30 #1
Kan du ikke lige komme med noget eksempel data, og hvad du gerne vil ha som resultat ?
Avatar billede bigo Nybegynder
11. november 2004 - 09:52 #2
hmm.

$IP_array = array (
"10.0.0.11",
"10.0.0.12",
"10.0.0.14",
"10.0.0.15",
"10.0.0.17",
"10.0.0.21"
)

her vil jer gerne have resultatet 10.0.0.13 da det er den næste ledige (der er hul imellem .12 og .14

udvidder vi arrayet lidt (forestil dig at der er fyldt ud med ipadresser i arrayet)

$IP_array = array (
"10.0.0.11",
"10.0.0.12",
"10.0.0.13",
"10.0.0.14",
"10.0.0.15",
"10.0.0.16",
"10.0.0.17",
.
.
.. Her er en masse ipadresser ;-)
.
.
"10.0.0.252",
"10.0.0.253"
)

her skulle resultet være 10.0.0.254. His der bliver kørt igennem igen skal resultatet ikke være 10.0.0.255 (ulovlig) men man skal så undersøg om der er nogle ledige i 10.0.1.10 ++ segmentet.
Avatar billede hmortensen Nybegynder
11. november 2004 - 16:40 #3
Hvis nu der skal undersøges i næste range, har du så et nyt array ?
Avatar billede bigo Nybegynder
11. november 2004 - 23:21 #4
Nope. Eller.. Der er egentlig to muligheder. Det kan fortsætte :

$IP_array = array (
"10.0.0.11",
"10.0.0.12",
"10.0.0.13",
"10.0.0.14",
"10.0.0.15",
"10.0.0.16",
"10.0.0.17",
.
.
.. Her er en masse ipadresser ;-)
.
.
"10.0.0.252",
"10.0.0.253",
"10.0.0.254",
"10.0.1.11",
"10.0.1.12",
"10.0.1.13",
..
..
.
";

eller det kan være at der ikke er flere i arrayet og så skal man selv finde ud af hvad det næste er - oktet + 1 agtigt..
Avatar billede bojo Nybegynder
12. november 2004 - 08:38 #5
nok ikke verdens hurtigste metode...

<?php

$IP_array = array (
"10.0.0.10",
"10.0.0.11",
"10.0.0.12",
"10.0.0.13",
"10.0.0.14",
"10.0.0.15",
"10.0.0.16",
"10.0.0.17",
"10.0.0.252",
"10.0.0.253",
"10.0.0.254",
"10.0.1.11",
"10.0.1.12",
"10.0.1.13",
);

$flipped = array_flip( $IP_array );

$found = false;
$x1 = 10;
$x2 = 0;
for( $x3=0; $x3<255 && !$found; $x3++ )
  for( $x4=10; $x4<255; $x4++ ) {
      $key=$x1.'.'.$x2.'.'.$x3.'.'.$x4;
      if( !isset( $flipped[$key] ) ) {
        $found=true;
        break;
      }

  }
echo "<p />Done, first free is: ".$key;
?>
Avatar billede hmortensen Nybegynder
12. november 2004 - 13:11 #6
Kunne også gøres sådan her. Jeg ved ikke hvad der er bedst, men nu har du da lidt at lege med

function FindLedigIP($ip_array, $var = 0) {
    sort($ip_array);
    $octet = explode(".", $ip_array[0]);
    $third = $octet[2]+$var;
    $range = $octet[0].".".$octet[1].".".$third.".";
    $i = 11;
    while ($i < 255) {
        $ip = $range.$i;
        if (!in_array($ip, $ip_array)) {
            echo $ip;
            exit;
        }
        $i++;
    }
    FindLedigIP($ip_array, $var+=1);
}
Avatar billede bigo Nybegynder
15. november 2004 - 09:50 #7
Jeg forstår ikke..

jeg har rettet en lille smule i scriptet:

  $ip_array === usort ($ip_array, "strnatcmp");

  $octet = explode(".", $ip_array[0]);
  $third = $octet[2]+$var;
  $range = $octet[0].".".$octet[1].".".$third.".";
  $i = 11;
  while ($i < 255)
  {
    $ip = $range."$i";
    if (!in_array($ip, $ip_array))
      return $ip;
    $i++;
  }
  FindLedigIP($ip_segment, $var+=1);
} // end function FindLedigIP

og en

  $ip_array === usort ($ip_array, "strnatcmp");

  $octet = explode(".", $ip_array[0]);
  $third = $octet[2]+$var;
  $range = $octet[0].".".$octet[1].".".$third.".";
  $i = 11;
  while ($i < 255)
  {
    $ip = $range."$i";
    if (!in_array($ip, $ip_array))
    {
echo $ip; 
  return $ip;
}
    $i++;
  }

udskriver det ledige ipnummer men hvis jeg kalder funktionen med f.eks.
echo "Ting:".FindLedigIP($PublicIP)."<br>";

udskriver den kun

Ting:

Er det return tingen der ikke fungerer eller...
Avatar billede bigo Nybegynder
15. november 2004 - 09:52 #8
og $PublicIP er f.eks. 10 = første oktet i det der skal søges efter..
Avatar billede bigo Nybegynder
15. november 2004 - 11:05 #9
fandt ud af det:

Det recursive kald skal naturligvis returnere værdi.

så
  while ($i < 255)
  {
    $ip = $range."$i";
    if (!in_array($ip, $ip_array))
      return $ip;
    $i++;
  }
  return FindLedigIP($ip_segment, $var+=1);
} // end function FindLedigIP
Avatar billede bigo Nybegynder
15. november 2004 - 11:06 #10
Ting virker og jeg er glad.

Venligst smid et svar
Avatar billede hmortensen Nybegynder
15. november 2004 - 11:31 #11
Hvem af os ?
Avatar billede bigo Nybegynder
15. november 2004 - 23:57 #12
Tja, egentlig ville jeg sige jer begge, men jeg benyttede din <hmortensen>.
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