Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Verschachtelte for schleife

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
12.01.2005, 15:15 Uhr
Manuel Hoelig



Hallo,
ich schreibe gerade an einem Netzwerkanalyse Programm. um die IP Nummern Hochzuzählen verwende ich eine vierfach verschachtelte for schleife.
code:

C++:
int endwert=255;
for(int var1=0; var1 <= endwert; var1++){
  for(int var2=0; var2 <= endwert; var2++){
    for(int var3=0; var3 <= endwert; var3++){
      for(int var4=0; var4 <= endwert; var4++){
        /.. anweisung ..\
      }
    }
  }
}


Wie ihr euch sicherlich vorstellen könnt, brauch die schleife allein nur für das Hochzählen (von 0.0.0.0 bis 255.255.255.255) schon seine gewisse zeit.

somit suche ich nun nach einen algorithmus beziungsweise eine Methode um diese schleife zu vereinfachen. (mit anderen worten wie könnte ich die schleife schneller machen.)
Grüsse Manuel


Bearbeitung von Pablo:

Benutze CPP Tags selber

Dieser Post wurde am 12.01.2005 um 21:22 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.01.2005, 15:46 Uhr
virtual
Sexiest Bit alive
(Operator)


Naja, also 256*256*256*256 entspricht grob gerechnet 4,2 Milliarden Schleifendurchläufen. Wenn Dann darin noch was passieren soll, wird es halt eng. Es wird dir vermutlich auch wenig Helfen, das alles in in einer Schleife abzufackeln, weil es einfach zuviele Zahlen sind: Wenn man mal unterstellt, daß die Anweisung in der Innersten Schleife eine Millisekunde Dauert, wird Dein Programm ca. 49-50 Tage beschägtigt sein. Netzwerkanalyse bedeutet wohl sowas wie Sockets aufbauen, da bist Du pro Socket ganz schnell über 1 Millisekunde...

Deshalb solltest Du das Programm generell von der Idee her überdenken (Ich weiß ja nicht, was Du vorhast)

Was die Vereinfachung der Schleife angeht: ja, könnte man machen, allerdings ist der Overhead, den die For schleifen generieren eher gering. Du könntest zwar sowas machen:

C++:
for(unsigned long i=0; i<=0xffffffff; ++i) {
// i ist nun die Binärdarstellung der IP Adresse
}


allerdings solltest Du eher mal überlegen, was Du machen willst, ob für die Aufgabe ggf. bestimmte Netzwerkprotokalle bereitsexistieren (Broadcasting) und welche IP Adressen überhaupt in Frage kommen (Sub-net-masking)
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.01.2005, 20:26 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@virtual
bist du sicher das das funzt... sizeof(unsigned long) muss doch echt grösser als 4 sein an sonsten ist es immer kleiner als 0xffffffff... nach überlauf ist es ja gleich wieder 0 oder wo ist mein denkfehlerchen?...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.01.2005, 20:37 Uhr
Manuel Hoelig



Gott sei dank bin ich nicht bei ca 50 tagen "nur" bei 2h . Was ich machen möchte ist, das IP netz hoch und runter zulaufen um so alle intern und externen vergebenen Adressen an zusprächen um jeweilige Software o. Hardware fehl Einstellungen raus zu finden.
(Das nicht ein Rechner über zwei IP angesprochen werden kann und diese IP mit unterschiedlichen rechten verwaltet wird.)

Dieser Post wurde am 12.01.2005 um 20:42 Uhr von Manuel Hoelig editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.01.2005, 20:57 Uhr
Hans
Library Walker
(Operator)



Zitat von Windalf:
@virtual
bist du sicher das das funzt... sizeof(unsigned long) muss doch echt grösser als 4 sein an sonsten ist es immer kleiner als 0xffffffff... nach überlauf ist es ja gleich wieder 0 oder wo ist mein denkfehlerchen?...


Hi,
soweit wie ich das übersehe, verwechselst Du da irgendwas. unsigned long ist zwar meisst 4 Byte gross, aber Du brauchst ja auch genau 4 Bytes. Nur das Vorzeichen eben nicht; - aber deshalb wird ja unsigned verwendet.
Und wenn du mal nachsiehst, was dieses hübsche Programm hier liefert:

C++:
#include <stdio.h>
#include <limits.h>

int main()
{

  printf ("Grösse von unsigned long: %d Byte\n", sizeof(unsigned long));
  printf ("Maximaler Wert von unsigned long: %0x\n", ULONG_MAX);
    
  return 0;
}


Bei mir kommt das raus:

Zitat:

D:\borland\CommandLine\own>ulong
Grösse von unsigned long: 4 Byte
Maximaler Wert von unsigned long: ffffffff


und das passt doch genau.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 12.01.2005 um 20:58 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.01.2005, 21:24 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

und das passt doch genau.


eben und in der schleifenbedigung steht kleiner gleich... das heisst in dem fall ist die bedinung erfüllt... wenn du dann nochmal incrementierst bist du wieder bei 0 und die schleife rauscht weiter durch...
wenn man das kleiner gleich weglässt fehlt aber die 255.255.255.255...
zugegebener weise spitzfindig dachte aber ich merks mal an
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.01.2005, 22:14 Uhr
virtual
Sexiest Bit alive
(Operator)


Jau, ist gerechtfertigt.
Dann eben

C++:
for(unsigned long i=1; i!=0; ++i) {
...
}


Weil 0.0.0.0 ohnehin keine IP von Interesse ist...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.01.2005, 22:33 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Manuel Hoelig:
Gott sei dank bin ich nicht bei ca 50 tagen "nur" bei 2h .

Dann rechne doch mal genau nach:

Die For schleifen produzieren 256*256*256*256 = 4294967296 Durchläufe
Bei 1000 Durchläufen pro Sekunde (wohlgemerkt bei Deiner Aufgabenstellung eine äußerst geschönte Rechnung!), also brauchen wir mehr als 4294967 Sekunden. Das sind mehr als 1193 Stunden, also mehr als 49 Tage.

In wirklichkeit wirst Du aber folgendes Problem haben: ein großer Anteil der IP Adressen wird auf Deine Connectversuche mittels Socket nicht reagieren, dies gilt insbesondere bei den "äußeren Netz", weil die entweder durch firewall einstellung entsprechend geschützt oder eben nicht vorhanden sind. Hier kannst Du mit Wartezeiten um die 3 Sekunden mimimum rechnen. Also multipliziere die 49 Tage mal getrost mit 365...

Im "inneren" Netz, also dem Lokalen, kannst Du die Subnetzmaske heranziehen, um zu ermitteln, welche IP Adressen über haupt in Frage kommen. Wenn Du Glück hast, hast Du nur ein Class B Netz und damit nur knapp 65536 Durchläufe (Strenggenommen sogar etwas weniger, weil bestimmte IP Adresse auch hier nicht in Frage kommen).

Letztlich ist dieser naive Ansatz mit den geschachtelten Schleifen zum Scheitern verurteilt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.01.2005, 22:36 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


für sowas macht man doch eher sowas wie nen broadcast (Brotkasten )... (weiss gerade nicht welche ip dafür vorgesehen ist glaub das sind die 255er) und dann antworten die, die man erreicht....
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 12.01.2005 um 22:36 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
12.01.2005, 22:37 Uhr
Hans
Library Walker
(Operator)



Zitat von Windalf:
eben und in der schleifenbedigung steht kleiner gleich... das heisst in dem fall ist die bedinung erfüllt... wenn du dann nochmal incrementierst bist du wieder bei 0 und die schleife rauscht weiter durch...
wenn man das kleiner gleich weglässt fehlt aber die 255.255.255.255...
zugegebener weise spitzfindig dachte aber ich merks mal an

Hi,

da hast Du sogar recht. Das ist ein Fehler der Kategorie "um 1 daneben". Da würde kleiner als Schleifenbedingung genügen. Und die Adresse 255.255.255.255 hat sowieso auch eine Sonderbedeutung, so das ein spezieller Test in der Schleife nicht nötig ist.
Ansonsten lässt man die Schleife bis 255.255.255.254 durchlaufen, und testet 255.255.255.255 separat danach.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: